c语言中的fputs和fwrite中隐藏的陷阱!!

draculamx 2015-03-25 11:38:42
这些天在弄文件操作,不可避免的涉及到文件读写,采用了两种方式,C语言中的fopen,fwrite系列,还有就是windows api,createfile,readfile系列。

让我发现了fputs和fwrite中的陷阱:
问题是这样的,在写入文件的时候,我需要写入“回车换行”,众所周知,应该写入两个字符'\r'和'\n'



char p[20]="abc\r\nabc\r\n\0";
fputs(p,lpfile);



上面的代码执行之后,会产生什么结果呢?很显然,在你的文本文件中,应该出现两行字符,内容都是abc。
没错,当你打开文本文件的时候,确实是这样。但这是一个陷阱!!
此刻,你将你的文本文件保存,关闭,然后再打开,奇怪的事情发生了,文本文件中显示的内容发生了变化,里面只显示了一行字符:abcabc。为毛会这样呢??

用工具将文本文件用16进制打开,可以看到如下的结果。



61 62 63 0D 0D 0A 61 62 63 0D 0D 0A



看见了没?0D就是'\r',0A就是'\n',在字符abc之后,出现了2个'\r',一个'\n'。。。。。

为什么会多出一个 '\r' 呢??

我分析原因是这样:因为fputs函数,在输入'\n'的时候,会最自动在前面添加一个'\r',你自己又写入了一个'\r',所以,多出了一个。我只能这么解释了,看你们有什么高见。。。。

经实验,fwrite同样有这个问题,这纯粹是“好心帮倒忙”。。。。。

所以我放弃了c语言的文件读写函数,改用了windows api的文件读写函数。

也许这些东西你们早就知道了。。。为什么不早点告诉我。。5555

...全文
1652 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
过客猫2022 2015-05-12
  • 打赏
  • 举报
回复
这个不是陷阱,这是经验不足!对C的API不了解,就会这样!
draculamx 2015-03-26
  • 打赏
  • 举报
回复
引用 2 楼 ccrun 的回复:
fopen的时候指定b参数就行了
对啊,指定b的话,就是写二进制,这些函数就不会像在处理文本的时候那样,自己去“加工”了。。
draculamx 2015-03-25
  • 打赏
  • 举报
回复
fputs和fwrite函数的这个特性,可能和C语言的跨平台有关,当你在windows平台上输'\n'时,它会在前面自动添加一个'\r'。 如果是这样的话,是不是不管什么平台,是用这两个函数写入换行的时候,都只需要写一个'\n'就可以了? 有linux平台的朋友可以试一下。因为linux和windows平台的换行符定义不一样
ccrun.com 2015-03-25
  • 打赏
  • 举报
回复
fopen的时候指定b参数就行了

552

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 茶馆
社区管理员
  • 茶馆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧