BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #44263同步于 2010/9/26
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[请教]以binary按块儿读写文件时,处理的大小大于实际

wangfuwei
2010/9/26镜像同步6 回复
这两天在做一个加密程序,需要从文件读入数据,每八位进行加密后存入加密文件中,用了C++的fstream。为了能够对所有文件都支持,所以打开文件时以二进制形式打开源文件和目标文件。但是现在出现了一个异常——在加密、解密文本文档后,发现解密出来的东西最后重复出现了原文件末尾的几个字符,重复两次。 开始时怀疑是加密算法处理有问题,于是用下面的代码试了一下,结果发现是fstream用的似乎有问题: #include <iostream> #include <fstream> using namespace std; int main() { char temp[9]; ifstream source; ofstream target; source.open("D:\\nxx.txt",ifstream::in | ifstream::binary); target.open("D:\\nxx2.txt",ofstream::binary); while (!source.eof()) { source.read(temp,8); target.write(temp,8); } source.close(); target.close(); return 0; } 以上代码就是简单的打开一个文件,每八位读入缓冲区,再从缓冲区写道文件中。但是,问题依然存在:即便没有加密环节,生成的文件末尾还是多出来了几个字符,就是源文件末尾的三个字符。用上述程序对其他非文本文档进行试验,发现生成的文件都要比源文件大几个字节。 求问:在文件的末尾,应该是已经判断到了infile.eof(),那么为什么还会有后面的内容?怎么样正确使用那个read()来读取文件块?
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
buptljl机器人#1 · 2010/9/26
当while循环最后一次执行时,你读入的字符数不一定刚好是8个,但写入文件时还是写入了8个,其中这8个字符包括你刚才读入的和倒数第二次循环里读入的字符,所以会多几个字符
wangfuwei机器人#2 · 2010/9/26
我猜大概可能有这种可能:eof()判断当前文件指针的位置是否是文件结束符,但是当在文件尾部读取8字节时,文件指针指向的是eof前面的某个位置,在读取了8字节后,指向的又是eof之后的某个位置了…… 不知道有没有可能是这个原因
buptljl机器人#3 · 2010/9/26
【 在 wangfuwei 的大作中提到: 】 : 我猜大概可能有这种可能:eof()判断当前文件指针的位置是否是文件结束符,但是当在文件尾部读取8字节时,文件指针指向的是eof前面的某个位置,在读取了8字节后,指向的又是eof之后的某个位置了…… : 不知道有没有可能是这个原因 : -- : ................... 没有这个可能,读到结束符就会停止,不管有没有读入指定的数目,最后多的那几个字符是倒数第二次读入的字符中未被最后一次读入字符覆盖的
wangfuwei机器人#4 · 2010/9/26
但是在每次执行write()之前都将缓冲区memset为'\0',似乎还是没有变化……
buptljl机器人#5 · 2010/9/26
【 在 wangfuwei 的大作中提到: 】 : 但是在每次执行write()之前都将缓冲区memset为'\0',似乎还是没有变化…… : -- 空字符也会写进去,你最好看一下read和write函数说明
RaulSpain007机器人#6 · 2010/9/27
同遇到过这种问题,你可以之前先写一个size标注你实际内容的长度,然后根据这个长度来读,c++的流好像就是有这个问题,具体原因不明,实在不行改用c的