C++中的字符串:good()和get()的问题

zed*_*111 0 c++ string file-io

我想从一个文件中读取.我用的代码是

      ifstream is;char c;
      is.open("text.txt");
      while(is.good() && !isdigit(is.peek()))
      {     is.get(c)
            word+=c;

       }
Run Code Online (Sandbox Code Playgroud)

问题是最后一个字符被读取两次(为什么?)例如,如果文件中的单词是粉红色的,那么单词的值在循环后变为粉红色请建议解决方案

Die*_*ühl 5

您总是希望尝试阅读检查输入是否成功.当流不知道将要读取什么类型的值时,您首先检查.如果你想使用peek()你应该std::char_traits<char>::eof()首先测试,例如:

for (std::char_traits<char>::int_type c;
     std::char_traits<char>::eof() != (c = in.peek())
     && !std::isdigit(static_cast<unsigned char>(c); ) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

在您的设置中,我个人会使用std::istreambuf_iterator<char>它,因为它实际上更容易:

for (std::istreambuf_iterator<char> it(in), end;
     it != end && !std::isdigit(static_cast<unsigned char>(*it); ++it) {
    word += *it;
}
Run Code Online (Sandbox Code Playgroud)

请注意,char可能是未签名但std::isdigit()需要正值.如果char使用我的第二个名称签名通常会导致未定义的行为.为了避免这个问题char,std::isdigit()应该unsigned char首先转换为pass .