文件处理中的tellg()和tellp()函数显示出意外行为



这是我下面的代码。

这里的输出是(Hi 5(。如果我删除第三行(用于(输出为(Hi 4(。从技术上讲,输出应该是(Hi 3(,但tellg((随着行的每增加而增加。

#include<bits/stdc++.h>
void main(){
fstream file("d.txt",ios::trunc | ios::in | ios::out);
string c;
file<<"Hi there"<<endl;
file<<"good evil"<<endl;
file<<"use to"<<endl;
file.seekg(0,ios::beg);
file>>c;
cout<<c<<" "<<file.tellg()<<endl;
}

标准实际上并不保证tellg有任何特定的值,只是如果seekg在某个时间之后在其输出上运行,它会将流放在原来的位置。在任何情况下,tellg的输出都是实现定义的。它甚至不必转换为积分类型。就实现而言,通常在二进制模式下(对于*nix系统,在文本模式下(打开的文件将产生与文件开头的字节偏移量相等的tellg输出,而在文本模式(非*nix(下,产生大于或等于字节偏移量的某个值。

由于每次添加一行时tellg增加1的特定原因,可能影响编译器中此实现定义行为的一个因素可能是Windows行终止符nr是两个字节而不是一个字节。当然,依赖实现定义的行为通常是个坏主意。

来源:https://stackoverflow.com/a/22986486

最新更新