文件读写的字节数问题

发信人: 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 (平花星星#我的爱像天使守护你) 的大作中提到: 】                                                         
                                 
                                           

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值