免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6528 | 回复: 18
打印 上一主题 下一主题

[C++] 请教一个c++读取文件的问题,急 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-04-25 16:54 |只看该作者 |正序浏览
在c++里
memset( buff , 0x00 , sizeof( buff ) ) ;
fp = fopen( "filename" , "r" ) ;
fread( buff , 1000 , 1 , fp ) ;
buff[strlen(buff)] = '\0' ;
log( buff ) ;(把buff printf出来)结果buff后面有乱码,怎么解决?
buff里面有很多行,包括换行符号的
unix下c没有问题

论坛徽章:
0
19 [报告]
发表于 2004-05-11 21:26 |只看该作者

请教一个c++读取文件的问题,急

精灵王的水平真的很强,佩服佩服啊!!!

提倡大家都向你学习,学习你的求真的精神,呵呵

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
18 [报告]
发表于 2004-05-07 17:05 |只看该作者

请教一个c++读取文件的问题,急

[quote]原帖由 "llzh"]buff[strlen(buff)] = '\0' ;[/quote 发表:

脱了裤子放不出来屁。

比脱了裤子放屁还浪费。

论坛徽章:
0
17 [报告]
发表于 2004-05-07 00:44 |只看该作者

请教一个c++读取文件的问题,急

楼主,你用
fp = fopen( "filename" , "r" ) ;
fread( buff , 1000 , 1 , fp ) ;//fread是用于二进制文件的,用"r"是不
//是文本方式打开的?我的QQ是:21546640

论坛徽章:
0
16 [报告]
发表于 2004-04-27 18:28 |只看该作者

请教一个c++读取文件的问题,急

对!就是这个原因,我后来发现每一行后面有0D 0A两个字节,也就是楼上说的'\r','\n'。于是又改回用实际长度去读取,居然可以,虽然交差通过不过仍然不是很理解,怀疑原文件有问题。
现在听楼上一说,才明白其中原因,楼上严谨的态度让我佩服,再次谢谢

论坛徽章:
0
15 [报告]
发表于 2004-04-27 13:17 |只看该作者

请教一个c++读取文件的问题,急

>;>; 现在我把它换成fgets,多取几次算了,至少结果是正确的
楼主已经换用 fgets (可能写文件的时候还有 fputs)实现了要求,本来不想再说什么了。但是以前用 fread(应当还有 fwrite,虽然楼主没有向我们说明)的时候还没有得到正确的结果,其原因还没有解明,觉得有必要再提醒一下。

我在上面已经指出了使用 fread 正确读出文件内容到 buff 中的方式,其关键就是根据 fread 的返回值(即实际读取的字符数)来确定字符串结束标志 '\0' 在 buff 中的位置。本来希望对楼主有所启发,但是楼主却执着于根据文件的大小来确定写入文件的字符数(应该告诉而没有告诉我们),看来没有达到目的。

楼主给出的代码如下:
memset( buff , 0x00 , sizeof( buff ) ) ;
fp = fopen( "filename" , "r" ) ;
fread( buff , 1000 , 1 , fp ) ;
buff[strlen(buff)] = '\0' ;
log( buff ) ;

log 函数之前的问题我上面已经给解决了(再重复一遍:程序中的 memset 函数的使用没有任何必要性。楼主好像还是没有意识到这一点)显然,log 函数是把 buff 中的字符串写到一个文件中。楼主的程序之所以出问题,就在于在 log 函数内的处理错误:在写 buff 到文件中的时候,对于写入的字符数,用的是文件长度,而不是 buff 字符串的实际长度!如果改为:fwrite( buff, sizeof(char), strlen(buff), fp );就能得到正确的结果了。

那么,原来的程序为什么在 Unix 执行正确而在 Windows 下执行就得不到正确结果呢?其原因在于 Unix 和 Windows 下文本文件对于换行符号的处理不同:Unix 在每一行尾用一个字符 '\n' 表示换行,而 Windows 用 '\r' 和 '\n' 两个字符表示换行;但是在用C/C++读取到内存之后,无论在哪个系统上,却都是转换成 '\n' 一个字符,由此导致在 Windows 下 fread 出的文件长度并不对应文件中的字符数(在Unix下不存在这一问题),所以不要根据文件长度确定文件中的字符数(根据文件大小判断所需要分配的存储空间大小还是可以的),应该使用字符串的实际长度。

楼主上面给出的结果分析也说明了这一点。
>;>; 而且好象后面多出的字节刚好是文件的行数
>;>; 比如有10行,就多出10 个乱字节
>;>; 但是不是出现在没一行后面,而是在全部打出之后

论坛徽章:
0
14 [报告]
发表于 2004-04-26 13:53 |只看该作者

请教一个c++读取文件的问题,急

不好意思,有些没有说清楚,当时写出来是有点忙,本来是:
先取到文件长度lFilelen ,
buff = ( char *)malloc( lFilelen + 1 ) ; 之后的判断就不写了
memset( buff , 0x00 , lFilelen + 1 ) ;
然后再使用buff

多谢各位大侠关照,不胜感激

论坛徽章:
0
13 [报告]
发表于 2004-04-26 13:24 |只看该作者

请教一个c++读取文件的问题,急

如果buf是你在前面动态生成的话,你的这一句
>;>;memset( buff , 0x00 , sizeof( buff ) )
就有问题啊!这样的sizeof不能得到你想要的东西

论坛徽章:
0
12 [报告]
发表于 2004-04-26 12:55 |只看该作者

请教一个c++读取文件的问题,急

一样的结果

现在我把它换成fgets,多取几次算了,至少结果是正确的

论坛徽章:
0
11 [报告]
发表于 2004-04-26 09:51 |只看该作者

请教一个c++读取文件的问题,急

晕撒,,,换read不就没有了吗?试试
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP