C++ seekg的第二次呼叫不工作

C++ seekg的第二次呼叫不工作,c++,file-io,C++,File Io,在下面的代码中,我计算字数、行数,然后计算文本文件的大小。第一次使用seekg在第一次while循环后效果良好,但在第二次while循环后,它不起作用。它给出的值如输出所示 #include <iostream> #include <fstream> using namespace std ; int main(void) { fstream txtFile; txtFile.open("test.txt"); if(txtFile.is_o

在下面的代码中,我计算字数、行数,然后计算文本文件的大小。第一次使用
seekg
在第一次
while
循环后效果良好,但在第二次
while
循环后,它不起作用。它给出的值如输出所示

#include <iostream>
#include <fstream>
using namespace std ;

int main(void)
{
    fstream  txtFile;
    txtFile.open("test.txt");

    if(txtFile.is_open())
    {
        printf("txt file is opened");
    }

    //number of words and lines in txt file
    int w=0 , l =0 ;
    int c , start , end;
    string s;

    while(1)
    {
        if(txtFile.peek() == -1)
            break;
        c = txtFile.get();
        if(c != txtFile.eof())
                    w++;
    }

    txtFile.seekg(0,ios::beg);

    while(getline(txtFile,s))
    {
         l++ ;
    }
    printf("no of words : %d , no of  lines: %d\n",w,l);

    //calculate the size of both the files
    txtFile.seekg(0,ios::beg);
    start = txtFile.tellg();
    printf("%d\n",start);;
    txtFile.seekg(0, ios::end);
    end = txtFile.tellg();
    printf("%d\n",end);;

    return 0 ;
}


OUTPUT
txt file is opened
no of words : 128 , no of  lines: 50
-1
-1
#包括
#包括
使用名称空间std;
内部主(空)
{
fstream-txtFile;
打开(“test.txt”);
if(txtFile.is_open())
{
printf(“打开了txt文件”);
}
//txt文件中的字数和行数
int w=0,l=0;
int c,开始,结束;
字符串s;
而(1)
{
if(txtFile.peek()=-1)
打破
c=txtFile.get();
如果(c!=txtFile.eof())
w++;
}
seekg(0,ios::beg);
while(getline(txtFile,s))
{
l++;
}
printf(“字数:%d,行数:%d\n”,w,l);
//计算两个文件的大小
seekg(0,ios::beg);
start=txtFile.tellg();
printf(“%d\n”,开始);;
seekg(0,ios::end);
end=txtFile.tellg();
printf(“%d\n”,结束);;
返回0;
}
输出
txt文件已打开
字数:128行数:50行
-1
-1

最后一次输入操作导致设置失败位。如果在设置此位时调用
tellg
,它也将失败。在调用
tellg()
之前,需要调用
clear()


最后一次输入操作导致设置失败位。如果在设置此位时调用
tellg
,它也将失败。在调用
tellg()
之前,需要调用
clear()


+1不同之处在于,第一个循环仅设置
eofbit
,而第二个循环设置
eofbit
failbit
seekg()
自动清除
eofbit
但如果设置了任何其他标志,则会失败。@CaptainObvlious先生,您能告诉我您说的是哪一个“最后的输入操作”吗?另外,请告诉我您是如何知道失败位是否设置的???@CodeJack调用
getline(txtFile,s)
,我知道,因为标准告诉我so+1,区别在于第一个循环只设置
eofbit
,而第二个循环设置
eofbit
failbit
seekg()
自动清除
eofbit
但如果设置了任何其他标志,则会失败。@CaptainObvlious先生,您能告诉我您说的是哪一个“最后的输入操作”吗?另外,请告诉我您是如何知道是否设置了失败位的???@CodeJack调用
getline(txtFile,s)
,我知道,因为标准告诉了我这一点
txtFile.clear(); // clear fail bits
txtFile.seekg(0,ios::beg);