c++ - Tellg 返回意外值

标签 c++ file fstream ifstream file-handling

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

我的职能是:

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。 但是我不明白打印第 2 行 [哈希值 1] 和第 7 行 [哈希值 6] 时发生了什么。

有人可以帮我解决这个问题吗?

最佳答案

一些事情:

  • 首先,您不是逐行阅读,所以 没有理由假设你增加了字符数 每次通过循环在一行中。如果你想读行 按行,使用 std::getline,然后从中提取字段 该行,使用 std::istringstream 或其他一些 方法。

  • tellg的结果不是整数,当转换为 整数类型(不一定可能),没有 保证与您拥有的字节数的关系 提取。在 Unix 机器上,结果将对应,并且 在 Windows 下 if(且仅当)文件已在 二进制模式。在其他系统上,可能没有可见的 什么关系都没有。唯一有效的可移植使用 tellg 的结果是稍后将其传递给 seekg;任何事物 其他取决于实现。

  • 你怎么知道每一行恰好包含 76 个字符? 根据文件的生成方式,可能有一个 BOM 开头(如果文件在 以 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 在某些情况下可能很有用。)

关于c++ - Tellg 返回意外值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26399146/

相关文章:

c++ - 实现基于表查找的三角函数

c++ - windows平台下socket通信中如何使用c++发送结构体

c++ - 如何在 Windows 下监控/记录对远程文件夹的文件访问?

java - 将数组的字符串输出到 java 中的 JTextArea

C++ 动态分配数组;大小由用户输入的数量设置;写入文件;

c++ - 为什么这只是一个空白的输出文件

c++ - 通过 Shader DirectX 9 传递纹理

c++ - 创建模板 TreeNodes 列表时出错

file - 将 gitlab 提交消息保存到文件

c++ - 正确选择文件流对象