- 论坛徽章:
- 0
|
请教一个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 个乱字节
>;>; 但是不是出现在没一行后面,而是在全部打出之后 |
|