3

次の小さなプログラムでは、inputString を空白で読み取りたいと考えています。

#include <string>
#include <sstream>
#include <iostream>


int main( int argc , char ** argv ) {
   std::string inputString(" ITEM ");
   std::istringstream inputStream( inputString );

   //Template:

   T value;

   inputStream.unsetf(std::ios::skipws);
   inputStream >> value;

   std::cout << "Value: [" << value << "]" << std::endl;
   std::cout << "StringPos: " << inputStream.tellg() << std::endl;
   std::cout << "State: " << inputStream.good() << std::endl;
}

これにより、次の出力が生成されます。

Value: []
StringPos: -1
State: 0

unsetf() 呼び出しを削除すると、代わりに次のようになります。

Value: [ITEM]
StringPos: 4
State: 1

つまり、空白が無視された場合は期待どおりです。だから - 明らかに、「空白をスキップしない」設定に何か問題があります。任意のヒント?

編集:テンプレートのような「T値」を追加した後、例はコンパイルされなくなりました。しかし、それは重要です

inputStream >> value;

動作します。次のメタコードも同様に機能するはずです。

if is_string(T)
   value = inputString;   // String values are assigned directly
else 
   inputStream >> value;  // Other types.

ヨアキム

4

1 に答える 1

4

使用する:

std::string line;
if(std::getline(inputStream, line)) {
    // line contains one line from the input stream
} else {
    // inputStream is empty, EOF or in error state
}
于 2013-10-09T11:34:27.173 に答える