c ++ ifstream,检测字母或EOLine?

时间:2009-01-25 09:30:37

标签: c++ ifstream eol

我有这个函数来读取文件中的所有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;
    }

2 个答案:

答案 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)
         );