我有一个从文件中读取行的函数。但是在读取之前,它将返回要从其读取下一行的地址。

我的功能是:

void print()
    {
        int j=0;
        string a,b,c,d,e;
        ifstream i("data.txt");
        cout<<setw(15)<<left<<"Hash Value"<<setw(15)<<left<<"Employee Name"<<setw(15)<<left<<"Employee ID"<<setw(15)<<left<<"Salary"<<setw(15)<<left<<"Link"<<endl;
        while(j<10)
        {
            j++;
            cout<<i.tellg()<<endl;
            i>>a>>b>>c>>d>>e;
            cout<<setw(15)<<left<<a<<setw(15)<<left<<b<<setw(15)<<left<<c<<setw(15)<<left<<d<<setw(15)<<left<<e<<endl;
        }
        i.close();
    }


它正在读取的文件是data.txt:

      0            ---              0              0             -1
      1            ---              0              0             -1
      2            ---              0              0             -1
      3            ---              0              0             -1
      4            ---              0              0             -1
      5            ---              0              0             -1
      6            ---              0              0             -1
      7            ---              0              0             -1
      8            ---              0              0             -1
      9            ---              0              0             -1


我得到的输出是:

Hash Value     Employee Name  Employee ID    Salary         Link
0
0              ---            0              0              -1
81
1              ---            0              0              -1
157
2              ---            0              0              -1
233
3              ---            0              0              -1
309
4              ---            0              0              -1
385
5              ---            0              0              -1
461
6              ---            0              0              -1
541
7              ---            0              0              -1
617
8              ---            0              0              -1
693
9              ---            0              0              -1


每行的长度为76个字符。因此,每次打印的地址都应增加76。
但是我不明白第二行打印出来的时候[哈希值1],而第七行打印出来的时候[哈希值6]。

有人可以帮我吗?

最佳答案

有两件事:


首先,您不是逐行阅读的,因此
没有理由假设您提高了字符数
每次循环都排成一行。如果你想读线
按行使用std::getline,然后从中提取字段
使用std::istringstream或其他命令
方法。
tellg的结果不是整数,并且转换为
整数类型(不一定可能),没有
保证的关系与您拥有的字节数
提取。在Unix机器上,结果将对应,并且
在Windows中,当(且仅当)文件已在
二进制模式。在其他系统上,可能看不到
关系是如此。唯一有效的便携式使用
tellg的结果是稍后将其传递给seekg;任何东西
否则要看执行情况。
您如何知道每一行正好包含76个字符?
根据文件的生成方式,可能会在
开始(如果文件位于
编码为UTF8,并且您使用的是“ C”语言环境)。那呢
尾随空格。同样,如果您的输入是面向行的,则您
应该先阅读行,然后解析它们。
最后,但也许是最重要的:您正在使用
>>的结果,而不验证操作员是否工作。在
您的案例,输出表明确实如此,但您永远不会
确保未经验证。


在全球范围内,您的循环应如下所示:

std::string line;
while ( std::getline( i, line ) ) {
    std::istringstream l( line );
    std::string a;
    std::string b;
    std::string c;
    std::string d;
    std::string e;
    l >> a >> b >> c >> d >> e >> std::ws;
    if ( !l || l.get() != EOF ) {
        //  Format error in line...
    } else {
        //  ...
    }
}


输出tellg仍然不会告诉您任何信息,但至少
您将正确阅读输入内容。 (输出长度
line在某些情况下可能有用。)

10-08 09:28