gpt4 book ai didi

c++ - Tellg 返回意外值

转载 作者:行者123 更新时间:2023-11-28 00:23:16 27 4
gpt4 key购买 nike

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

我的职能是:

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com