2012年(158)
分类: C/C++
2012-11-20 11:00:14
问题来源于一段简单的代码:
ifstream file( "test.txt" );
for( string line;
getline(file,line); )
{
file.tellg();
cout << line <<
endl;
}
在dev-cpp中调试发现,增加一句看似毫无危害的 file.tellg()
之后,整个读取完全乱套。
…………
◆文本文件在不同系统上有不同格式,比如Windows以\r\n为行的间隔,而Unix以\n为行的间隔。
◆以文本方式打开文件时,会进行控制字符的处理,控制字符一般在0x20以下,比如0x00作为文本文件的结束符号,0x07作为响铃……。因为Windows以\r\n为行的间隔,所以它会把\r\n转化为\n,而Unix以\n为行的间隔,所以\n仍然是\n。这样一来文本流中的位置和文件中的位置则不等同,在进行转化时,windows会对每个\n加上/减去1,即使它是unix格式的文件,而unix则不,即使它是windows格式的文件。
◆tellg其实是通过seek(0,cur)而来,由第二点可知,如果文件格式不对,那么位置就会错乱,tellg就错误地更改了指针位置。
由以上三点可以,文章开始给出的那段代码并没有任何问题,但对于gcc就必须给定unix格式的文本文件,对于vc就必须给定windows格式的文本文件,否则都无法保证正确性,会错误得很离谱。