C++ 在getline之后返回到文件的开头

C++ 在getline之后返回到文件的开头,c++,C++,所以我已经从一个文件中读到了所有的行 while (getline(ifile,line)) { // logic } 其中ifile是ifstream,line是字符串 我的问题是我现在想再次使用getline,并且似乎无法返回到文件的开头,因为正在运行 cout << getline(ifile,line); 但这似乎没有任何效果。如何返回到文件的开头?由于您已到达(并试图读取过去)文件的结尾,将设置eof和fail标志。您需要使用ifile清

所以我已经从一个文件中读到了所有的行

while (getline(ifile,line))
    {
        // logic
    }
其中ifile是ifstream,line是字符串

我的问题是我现在想再次使用getline,并且似乎无法返回到文件的开头,因为正在运行

cout << getline(ifile,line);
但这似乎没有任何效果。如何返回到文件的开头?

由于您已到达(并试图读取过去)文件的结尾,将设置
eof
fail
标志。您需要使用ifile清除它们。清除–然后尝试查找:

ifile.clear();
ifile.seekg(0);

这是因为已经在流上设置了eof标志-因为您到达了文件的末尾。因此,您必须将此作为附加步骤清除

乙二醇


仅供参考:在我的情况下,订单确实很重要,因此

  • 清楚的
  • 寻找

  • 否则下一个getline操作失败(MSVC v120)

    就像旁注一样,在C++11中,如果在调用之前设置了eofbit标志,seekg将清除该标志。我找不到任何对标准的引用,但可以说证据就在布丁中。除非在seekg()之前调用clear(),否则使用gcc9.2并使用c++17标准编译实际上不会导致流从头开始。也许这是gcc中的一个实现错误?再多读一个字符,它就会出现。同样,我不确定这是否是实现的某个工件,但如果您读取了流中可用的内容(从文件、字符串对象或任何其他流对象),则需要调用clear,然后seekg才能按所述工作。@没错,我的代码是完全不相关的。事实上,C++11没有改变相关的语义,我的答案是错误的。根据规范,代码仍会清除
    eofbit
    。但这还不够,因为一旦我们读取了文件的末尾,就会设置
    failbit
    (这是
    while(getline(…)
    循环的最后一次迭代所做的)。
    ifile.clear();
    ifile.seekg(0);
    
    ifile.clear();
    ifile.seekg (0, ios::beg);