免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6523 | 回复: 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
2 [报告]
发表于 2004-04-25 17:32 |只看该作者

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

buff[strlen(buff)] = '\0' ;
这一句理解肯定有错误
strlen依靠buff中的'\0'来计算长度,
没有'\0'之前,肯定strlen算不出正确的值来

论坛徽章:
0
3 [报告]
发表于 2004-04-25 17:46 |只看该作者

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

不好意思,实际程序里是
iBufflen = strlen( caBuff ) ;
caBuff[iBufflen] = '\0' ;

而且好象后面多出的字节刚好是文件的行数
比如有10行,就多出10 个乱字节
但是不是出现在没一行后面,而是在全部打出之后

论坛徽章:
0
4 [报告]
发表于 2004-04-25 17:56 |只看该作者

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

问题照旧
strlen怎么知道caBuff的长度呢?

论坛徽章:
0
5 [报告]
发表于 2004-04-25 18:32 |只看该作者

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

请问楼主,你读取的文件大小是不是超过了 1000 字符?如果没有超过,你应该能得到正确的结果;如果文件大小超过了 1000 字符,你的处理就是错误的了。在这种情况下,应该根据实际读出的字符数决定字符串结束标志的位置。

// memset( buff , 0x00 , sizeof( buff ) ) ; // 这一句没有必要
fp = fopen( "filename" , "r" ) ;
size_t n;
// fread( buff , 1000 , 1 , fp ) ;
n = fread( buff , 1 , 1000-1 , fp );
// buff[strlen(buff)] = '\0' ;  // 这一句实际上不起任何作用,因为 strlen 函数就是根据字符串结束标志 '\0' 工作的,即 buff[strlen(buff)] 一定为 '\0'。
buff[n] = '\0'; // 设置字符串结束标志

论坛徽章:
0
6 [报告]
发表于 2004-04-25 19:31 |只看该作者

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

cabuff 就是fread( "filename" , "r" l里面的buff

没有超过1000字符
而且buff[strlen(buff)] = '\0' 实际上是没有用到的,上面说到过
至于fread( buff , 1 , 1000-1 , fp ); 和fread( buff , 1000 , 1 , fp ) ;只是返回的items的问题,我以前试过,没有多大区别
请问1000的限制是什么原因?我现在已经很迷惘,以前都是在unix下写程序

论坛徽章:
0
7 [报告]
发表于 2004-04-25 19:35 |只看该作者

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

上面写错了
是fread( buff , 1, 1000,fp)里的buff就是caBuff

论坛徽章:
0
8 [报告]
发表于 2004-04-25 20:00 |只看该作者

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

原文件:588字节
3001        1234        00001        001        1105081101101000004927        5.99        435                        00       
3001        1235        00001        001        1105081101101000004927        5.99        435                        00       
3001        1236        00001        001        1105081101101000004927        5.99        435                        00       
3001        1236        00001        001        1105081101101000004927        5.99        435                        00       
3001        1236        00001        001        1105081101101000004927        5.99        435                        00       
3001        1236        00001        001        1105081101101000004927        5.99        435                        00       
3001        1236        00001        001        1105081101101000004927        5.99        435                        00       
3001        1236        00001        001        1105081101101000004927        5.99        435                        00       
3001        1236        00001        001        1105081101101000004927        5.99        435                        00       
3001        1236        00001        001        1105081101101000004927        5.99        435                        00

fread日志打出598字节
3001        1234        00001        001        1105081101101000004927        5.99        435                        00       
3001        1235        00001        001        1105081101101000004927        5.99        435                        00       
3001        1236        00001        001        1105081101101000004927        5.99        435                        00       
3001        1236        00001        001        1105081101101000004927        5.99        435                        00       
3001        1236        00001        001        1105081101101000004927        5.99        435                        00       
3001        1236        00001        001        1105081101101000004927        5.99        435                        00       
3001        1236        00001        001        1105081101101000004927        5.99        435                        00       
3001        1236        00001        001        1105081101101000004927        5.99        435                        00       
3001        1236        00001        001        1105081101101000004927        5.99        435                        00       
3001        1236        00001        001        1105081101101000004927        5.99        435                        00        屯屯屯屯?

论坛徽章:
0
9 [报告]
发表于 2004-04-25 20:16 |只看该作者

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

>;>; 而且buff[strlen(buff)] = '\0' 实际上是没有用到的,上面说到过
你明明在上面写了 iBufflen = strlen( caBuff ) ; caBuff[iBufflen] = '\0' ; 这和 caBuff[strlen( caBuff ) ] = '\0' 有何区别?

>;>; 至于fread( buff , 1 , 1000 , fp ); 和fread( buff , 1000 , 1 , fp ) ;只是返回的items的问题,我以前试过,没有多大区别
它们的区别就是返回值不同。而你正是需要根据这个返回值判断到底 fread 从文件中实际上读取了多少字节的字符,然后根据这个字符数设置字符串的结束标志,就象我在上面写的内容一样。如果是这样,你看应该使用那一种形式的 fread ?你觉得没有区别,那是因为你没有用到 fread 的返回值。

其实我上面已经给出你程序了,你为什么不试试之后再说呢?

>;>; 请问1000的限制是什么原因?我现在已经很迷惘,以前都是在unix下写程序
你可能定义用来存放字符的 buff 的大小为 1000,即 char buff[1000]。这样,buff 中最多只能存放 1000 个字符,显然,如果你的文件超过了 1000 字符,只读一次是不够的,即使是你在 Unix 下写的程序。

论坛徽章:
0
10 [报告]
发表于 2004-04-25 21:00 |只看该作者

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

size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
我也试过你那种方式,比如n = fread( buff , 400 , 1 , fp ) ; 正确返回值n=0;在unix下编译运行,如果是fread( buff , 1 , 400, fp ) 则正确返回为所读出的长度,函数在两个系统应该没有区别,我看了msdn

开始的buff,我是动态产生的,根据文件的长度申请内存+1,应该是没有问题的
谢谢你的回答,我刚才又试了一下,还是一样,不知道是不是别的原因
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP