Chinaunix首页 | 论坛 | 博客
  • 博客访问: 990849
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

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格式的文本文件,否则都无法保证正确性,会错误得很离谱。

阅读(1037) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

网友评论2012-11-20 11:11:16

Dic4000
对文件的读取最终还是会调用各自操作系统底层的API函数,不同的操作系统对换行标志的表示是不同的,binary标志正是为了抑制底层服务进行自动转换,达到统一而设立的.

网友评论2012-11-20 11:04:41

shanzy
这样一来文本流中的位置和文件中的位置则不等同,在进行转化时,windows会对每个\n加上/减去1

"在进行转化时,windows会对每个\n加上/减去1"这句话说的不对,MSDN中有篇文章提到了相关的内容,不过我一下子像不起来,找了一会也没找到,不过你说的肯定不对(或者说:可能操作上没问题,但不严格)..

楼下,知道的也来留个言