2

我一直在尝试使用 C++ stringstream 类来做一些相对简单的字符串操作,但是我遇到了 get() 方法的问题。出于某种原因,每当我逐个字符地提取输出时,它都会附加最后一个字母的第二个副本。

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main() {
   stringstream ss("hello");
   char c;

   while(!ss.eof()) {
      ss.get(c);
      cout << "char: " << c << endl;
   }
   return 0;
}

该程序的输出是:

char: h
char: e
char: l
char: l
char: o
char: o

您可以在这方面给我的任何帮助将不胜感激。

4

3 回答 3

8

在流的末尾ss.eof()还不知道即将到达流的末尾,但是以下字符的提取失败。由于到达流的末尾而导致提取失败,c因此不会更改。您的程序无法识别ss.get(c)失败并再次打印旧值c

检查是否仍有可以从流中读取的字符的更好方法是这样的循环:

while (ss.get(c)) {
   cout << "char: " << c << endl;
}
于 2009-10-09T00:39:37.860 回答
2

这是因为循环的顺序。您正在阅读 \0 和 EOF。

像这样重新排序您的代码

int main() {
   stringstream ss("hello");
   char c;

   ss.get(c);
   while(!ss.eof()) {
      cout << "char: " << c << endl;
      ss.get(c);
   }
   return 0;
}
于 2009-10-09T00:38:37.160 回答
1

仅当您尝试读取文件末尾的 PAST 时才会设置 EOF 标志。以下代码通过在 get() 之后而不是之前测试 EOF 来解决问题:

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main() {
   stringstream ss("hello");
   char c;

   while(1) {
      ss.get(c);
      if(ss.eof())
          break;

      cout << "char: " << c << endl;
   }
   return 0;
}
于 2009-10-09T00:41:49.727 回答