我有这个函数来读取文件中的所有int。 问题是,当我读取字母时,我触发了一条新线,而我总是在1处寻找而不是在线的末端。我怎样才能更好地编写这个函数?
int v;
while (!in.eof())
{
while (in >> v)
cout << v << " ";
cout << endl;
if (in.eof())
break;
in.clear();
in.seekg(1, ios::cur);
int a;
a=0;
}
答案 0 :(得分:3)
如果你的文件只包含由空格(包括)换行符分隔的整数,那么这就足够了。
while( in >> v )
{
// do something with v
}
在文件之后,如果in.fail()为false且in.eof()为true,则表示您已到达文件末尾而没有格式错误。否则会发生读取int的错误。
如果您收到无效输入并希望从中恢复,那么您需要确定要恢复的方式。如果你想跳到行尾并再次开始解析,你可以使用这样的东西。
in.clear();
in.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
答案 1 :(得分:1)
第一个问题上面的代码并没有停在行尾。
运算符&gt;&gt;()忽略“空格字符”,其中包含换行符。
怎样才能更好地写出来?
如果不知道你要对数字做什么以及文件的输入格式是什么,那很难说清楚!
但如果我正在写这篇文章,我会在不使用这些内容的情况下编写它:
if (in.eof())
break;
in.clear();
in.seekg(1, ios::cur);
处理格式化文本文件时,很少看到使用seek()。
Assumign:
文件只包含数字
您想将所有数字读入容器。
std::vector<int> data;
std::copy( std::istream_iterator<int>(in), // An iterator from current point
std::istream_iterator<int>(), // To end of file.
std::inserter(data) // Destination (insert into data)
);