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";
}
你爲什麼不閱讀你正在嘗試使用的函數的文檔? –