2009-06-24 4 views
0
class string 
{ 
    public: 
     friend istream& operator >> (istream& is, string& str); 
    private: 
     char *m_data; 
}; 

int main() 
{ 
    string str; 
    freopen("in.txt","r",stdin); 
    while(cin >> str) 
    { 
     cout < < str < < endl; 
    } 
    return 0; 
} 

あるin.txtの内容:オーバーロード関数のクラス文字列のオーバーロード演算子>>関数を書くにはどうすればよいですか?

asdfsfgfdgdfg 

、私はcoutの意志を意味し、それらのcharatersを一つずつ読んでますが、仕上がりをCINときにプログラムが円を飛び出すするis.get()を使用走りません。他の方法では、代わりにgetchar()を試してみますが、円を飛び越えることはできません。

質問:この機能に対する私の考えでは任意の間違っているのですか?またはもう一つのよりよい方法があります。 THX :)

=========================================== ============================= 新しい編集: ここに私のコード: @Artemバーガー コード詳細

#include <iostream> 

namespace Str 

{ 
    class string 
    { 
    public: 
     string():k(0){} 

    friend bool operator >> (std::istream& is, string& str) 
    { 
     int size = 100; 
     char m; 

     if((m = getchar()) && m == -1) 
      return false; 

     str.m_data = new char[size]; 

     do 
     { 
      if(str.k == size) 
      { 
       size *= 2; 
       char *temp = new char[size]; 
       for(int j = 0; j < str.k; ++j) 
       { 
        char *del = str.m_data; 
        temp[j] = *str.m_data++; 
        delete del; 
       } 
       str.m_data = temp; 
       temp = NULL; 
      } 

      str.m_data[str.k++] = m; 
     }while((m = getchar()) && m != -1); 

     return true; 
    } 

    friend void operator << (std::ostream& os, string& str) 
    { 
     os << str.m_data; 
     str.k = 0; 
     delete []str.m_data; 
    } 

private: 
    char *m_data; 
    int k; 
}; 
} 


using namespace Str; 
int main() 
{ 

string str; 

while(std::cin >> str) 
{ 
    std::cout << str; 
} 

return 0; 
} 

まだおそらく、あなたはあなたの問題を解決する必要のある、このようなあなたのコードを書き換えることができ

do 
{ 
}while(); 

答えて

1

の内容にいくつかの問題を抱えている:

bool success = true; 

while (sucess) { 
    success = cin >> str; 
    cout << str; 
} 

あなたはまだcoutが先に行きたい理由しかし、私は理解していない - cin呼び出しが成功しなかった場合、あなただけの文字列の古い内容を印刷します - あなたはどこでもそれをクリアしないでください(あなたがここに投稿していない他のコードでそうしない限り)。

関連する問題