文件读写的字节数问题

发信人: monoshade (我是大灰狠), 信区: CPlusPlus
标  题: 【求助】文件读写的问题
发信站: 北大未名站 (2010年08月04日15:14:18 星期三), 站内信件

想先读进来一个1MB的txt的文档,存在数组里,
再写入一个新建的文档,但是写完以后比原来的大,
结尾出多了好多“屯”,是什么原因?

读文档大小:1049133 字节
写文档大小:1102284 字节

程序:
#include
#include

using namespace std;

void main(){
        ifstream ifile("f.txt");
        if(!ifile){
                cout<<"can't open file"<                 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:"<         buf[len] = 'EOF';

        ofstream ofile("savef.txt");
        if(!ofile){
                cout<<"can't save file"<                 return;
        }
        // len这时是1049133
        ofile.write(buf,len);
        return;

}

--
http://www.daxuetang.com/epaper/epaper/20080620/01010303.jpg

※ 来源:·北大未名站 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:"<
        ifile.seekg(0,ios::beg);
        ifile.read(buf,len);
        memlen = ifile.gcount();
        cout<<"used buffer size:"<         cout<<"the file contains "<
【 在 gogdizzy (平花星星#我的爱像天使守护你) 的大作中提到: 】                                                         
                                 
                                           

你可能感兴趣的:(C++)