2011-12-08 19 views
0

ifstreamを文字列に読み込もうとしています。ここでは、読み取る文字数を設定できます。私はifstream.get()ifstream.getline()のドキュメントを読んだことがありますが、それらのどちらも私が望むものを達成できません。私は文字列に一度に文字の様々な数で読みたいifstreamの部分を文字列オブジェクトに読み込みますか?

asdfghjklqwertyuiop

は、次の文字列を与えられました。私はこのように始めましたが、私は最初のパラメータとして文字列を取る何の機能がありませんというエラーを取得しています:

string destination; 
int numberOfLettersToGet = 1; 

while (inputstream.get(destination, numberOfLettersToGet)){ 
    //Do something. 
} 

私はinputstream.get()の代わりに何を使用することができますか?

答えて

1

あなたはstd::istreamreadgcountメンバー関数を使用したいことがあります。 getにはゼロターミネータが付加されています。これは、std::stringに読み込むと不要になります。

std::string destination; 
int numberOfLettersToGet = 1; 

destination.resize(numberOfLettersToGet); 
std::streamsize n = inputstream.gcount(); 
inputstream.read(&destination[0], numberOfLettersToGet); 
destination.resize(inputstream.gcount() - n); // handle partial read 
+0

これは、 'gcount()'が現在のストリーム位置ではなく、最後の入力で読み取られた文字数を返すため、初めて動作します。 2回目を読むと、 'n 'が1(最後の読み込みからまだ設定されています)と' gcount() 'で始まり、読み込み後も1を返します。 1 - 1 = 0 - >空文字列。 'read'の後で' gcount() 'にリサイズするだけで十分です。 – Excelcius

1

istream::getは文字を整数として返します。したがって、返された文字を文字列の次の文字として追加するだけで済みます。例えば

while (string.push_back(inputstream.get())) 
{ //... 
} 
+0

非常に非効率的です。 – ThomasMcLeod

関連する問題