while(trainfile >> temp)
cout << temp << " ";
上述集上trainfile
的failbit
在遇到不是空白或数字的任何字符。这终止了循环。这是我倾向于不使用可能在输入流上失败的格式化I/O的原因之一。我发现最好是将文本读取为文本(而不是数字),然后处理刚才读取的字符串。例如,请参阅zenith的答案。
如果你坚持要从输入流中做所有事情,你需要一个外部循环来清除流的failbit
。例如,
while (! std::cin.eof())
{
while (std::cin >> temp)
{
std::cout << temp << " ";
}
std::cin.clear();
std::cin.ignore();
}
鉴于含有1 2 we er rf 5
的输入文件,上述将打印1 2 5
。如果输入文件包含1 2 abc345def 6
,以上将打印1 2 345 6
。请注意,天顶的方法将打印1 2 6
。 abc
和def
夹在345
之间是否以整数计为您自己。
我推荐使用zenith的解决方案。
更新:
上面解释abc345def
作为表示整数345
。 Zenith的解决方案和上面的解释345def
代表整数345
。对我而言,abc345def
和345def
应该被拒绝为代表整数。所以应该6.1
,但0x abc345def
没有错。 C标准库中有很好的工具,strtol
,很好地解析整数。它还表明是什么使解析停止。对于一个有效的整数,它应该停止在输入字符串的末尾。就这样,
#include <iostream>
#include < fstream>
#include <string>
#include <cstdlib>
int main()
{
std::ifstream trainfile("dfg.txt");
if (!trainfile)
{
std::cerr << "Cannot open file!\n";
exit(1);
}
std::string s;
while(trainfile >> s)
{
char* end;
long num = std::strtol (s.data(), &end, 0);
if (!*end)
{
std::cout << num << " ";
}
}
trainfile.close();
std::cout << "\n";
}
你为什么不阅读你正在尝试使用的函数的文档? –