我有一个从文件中读取行的函数。但在读取之前,它会返回要读取下一行的地址。
我的职能是:
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/