0

我以这种方式计算文件的行数

n = count(istreambuf_iterator<char>(file), istreambuf_iterator<char>(), '\n') + 1;

之后我想逐行阅读它,但这不起作用,

while (!file.eof()) {
    string row;

    file >> row;
    cout << row << endl;
}

因为我认为伯爵将位置移到了最后。如果我重新打开文件它可以工作,但我想这是一个丑陋的解决方案。

有什么方法/成员函数可以回到开头吗?

4

3 回答 3

1

“我以这种方式计算文件的行数......之后我想逐行阅读它”

你可以同时做这两件事:

std::ifstream filestream("somefile.ext");
std::vector<std::string> lines;

std::string line;
while (std::getline(filestream, line)) {
    lines.push_back(line);
}
std::cout << "file has " << lines.size() << " lines" << std::endl;

另请注意:

while (!file.eof()) {
    std::string row;
    file >> row;
    ... // doing something with row
}

不安全,因为>>可能会到达文件末尾或可能发生一些错误,因此循环体的其余部分不应依赖于它被正确读取。这是一个很好的方法:

std::string word;
while (file >> word) {
    ... // doing something with row
}

这实际上是逐字阅读(而不是逐行阅读)。

于 2013-11-14T19:16:16.040 回答
0

如果您要ifstream遍历文件,则可以使用以下命令调整读取位置seekg

例如:

std::ifstream file(...);
int linecount = 0;
while (!file.eof()) {
    if (file.get() == '\n') { ++linecount; }
}
// Clear the eofbit.  Not necessary in C++11.
file.setstate(0);  
// Rewind to the beginning of the file.
file.seekg(0);

如果您使用cin的是 ,那不是文件。所以你不能倒带。您可以存储每一行​​(如@LihO 建议的那样),或者重新处理您的处理,以便您遍历您的输入一次,一边计算行数。

于 2013-11-14T19:27:43.863 回答
0

清除错误位的 istream 并返回文件的开头。这是否是您想要做的最佳方法是另一个问题,具体取决于您的目标。

int main(int argc, char *argv[])
{
    ifstream file("file.txt");

    int n = count(istreambuf_iterator<char>(file), istreambuf_iterator<char>(), '\n') + 1;

    file.clear();
    file.seekg(0);

    string row;    

    while (file >> row)
        cout << row << endl;

    return (0);
}
于 2013-11-14T19:37:22.913 回答