发信人: monoshade (我是大灰狠), 信区: CPlusPlus
标 题: 【求助】文件读写的问题
发信站: 北大未名站 (2010年08月04日15:14:18 星期三), 站内信件
想先读进来一个1MB的txt的文档,存在数组里,
再写入一个新建的文档,但是写完以后比原来的大,
结尾出多了好多“屯”,是什么原因?
读文档大小:1049133 字节
写文档大小:1102284 字节
程序:
#include<fstream>
#include<iostream>
using namespace std;
void main(){
ifstream ifile("f.txt");
if(!ifile){
cout<<"can't open file"<<endl;
return;
}
int size = 1024*1024*2;
char * buf = new char[size];
int len = 0;
ifile.seekg(0,ios::end);
len = ifile.tellg();
ifile.seekg(0,ios::beg);
ifile.read(buf,len);
cout<<"len:"<<len<<endl;
buf[len] = 'EOF';
ofstream ofile("savef.txt");
if(!ofile){
cout<<"can't save file"<<endl;
return;
}
// len这时是1049133
ofile.write(buf,len);
return;
}
--
<img>http://www.daxuetang.com/epaper/epaper/20080620/01010303.jpg</img>
※ 来源:·北大未名站 bdwm.net·[FROM: 162.105.74.105]
全文链接:http://bdwm.net/bbs/t.php?CPlusPlus/M.1280906058.A/7955/0/0
发信人: gogdizzy (平花星星#我的爱像天使守护你), 信区: CPlusPlus
标 题: Re: 【求助】文件读写的问题
发信站: 北大未名站 (2010年08月04日18:00:27 星期三), 转信
查阅了一些资料,windows文件中的换行是/n/r,但是读入内存中只有/n,写回磁盘时又
变成/n/r,但是程序员在操作内存时,往往只看内存的字节数,例如
"abc/ndef/ngh",我们认为它有10个字符,所以一般会写ofile.write(buf,10);
但是操作系统会自动在磁盘上多开辟2个字符,用来将/n替换成/n/r。
悲剧的是,当你用seek获取文件大小时,给你的是包含/r的总数,对于上面的字符串,
系统会告诉你大小是12,所以你用ifile.seekg得到12,但是读入内存中,会自动将/n/r
替换成/n,也就是说,ifile.read(buf,12)中的12和我们本意上的10差了2,只有buf[0]到
buf[9]是你真正想要的内容,而buf[10]和buf[11]由于是局部变量区域,比较常见的初始
化值是0xCD,多了连起来就变成了“屯屯屯屯屯……”。
【 在 monoshade (我是大灰狠) 的大作中提到: 】
发信人: wwbmmm (wwbmmm), 信区: CPlusPlus
标 题: Re: 【求助】文件读写的问题
发信站: 北大未名站 (2010年08月04日20:35:34 星期三), 站内信件
用二进制方式读写
发信人: gogdizzy (平花星星#我的爱像天使守护你), 信区: CPlusPlus
标 题: Re: 【求助】文件读写的问题
发信站: 北大未名站 (2010年08月04日22:57:56 星期三), 转信
可以用gcount获取实际读取的字节数。
ifile.seekg(0,ios::end);
len = ifile.tellg();
cout<<"file size is:"<<len<<endl;
ifile.seekg(0,ios::beg);
ifile.read(buf,len);
memlen = ifile.gcount();
cout<<"used buffer size:"<<memlen<<endl;
cout<<"the file contains "<<len - memlen<<" CR/LFs"<<endl;
【 在 gogdizzy (平花星星#我的爱像天使守护你) 的大作中提到: 】