0

我有这个函数可以从文件中读取所有整数。问题是当我阅读字母时,我触发了一个新行,我总是按 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;
    }
4

2 回答 2

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' );
于 2009-01-25T09:44:00.920 回答
1

第一个问题,上面的代码不会停在行尾。
运算符>>() 忽略包含换行符的“空白字符”。

这个怎么写更好?
如果不知道您要对数字做什么以及文件的输入格式是什么,这很难说清楚!

但是如果我写这个,我会在不使用这些行的情况下写它:

    if (in.eof())
            break;
    in.clear();
    in.seekg(1, ios::cur);

在处理格式化的文本文件时,很少看到使用 seek()。

假设:
文件只包含数字。
您想将所有数字读入一个容器。

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)
         );
于 2009-01-25T15:49:05.073 回答