这是我下面的代码。
这里的输出是(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