您的位置:程序门 -> vc/mfc -> 基础类



关于文件复制的问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


关于文件复制的问题
发表于:2007-08-14 17:32:08 楼主
各位好,我要把两个文件拼接在一起,例如有test1和test2,我要把他们放到一起,存在test中,前边是txt1的内容,后边是txt2的内容.我是这样做的:

                  ofstream   fout( ".\\test.txt ",ios::out ¦ios::app);   //   打开test
cstring   tablename= "[test1]\r\n ";                             //   写入[test1]以标记
int   itsize=tablename.getlength();
fout.write(tablename,itsize);                                
ifstream   fintest1( ".\\test1.txt ",ios::in);       //   打开test1
fintest1.seekg(0,ios::end);
int   bytenum=fintest1.tellg();                             //   读取test1有多少字节
char   buffer;
finnetworkname.seekg(0,ios::beg);        
for   (int   i=0;i <bytenum;i++)                           //   按字节写入test    
                  {
        fintest1.read(&buffer,1);
        fout.write(&buffer,1);
}
                  tablename= "[test2]\r\n ";                   //   写入[test2]以标记
itsize=tablename.getlength();
fout.write(tablename,itsize);
ifstream   fintese2( ".\\test2.txt ",ios::in);
fintese2.seekg(0,ios::end);           //   读取test2有多少字节
bytenum=fintest2.tellg();
fintest2.seekg(0,ios::beg);
for   (i=0;i <bytenum;i++)                     //   将test2按字节写入
{
          fintest2.read((char*)&buffer,1);
          fout.write((char*)&buffer,1);
}
我遇到一个问题,就是因为test1和test2中都是有换行符的,拷贝到test中的时候,为什么test2和test1之间多出好多换行符,奇怪它是什么时候写入的呢,我看了test1的字节数bytenum和文件中字节数一样,我用for循环写的,换行符是从哪里来的,这样使得[test2]前边出现了空行,怎么让它不出现,使得test1后边紧接test2呢?或者大家还有什么好的方法能够使两个文件拼接到一起?谢谢大家回答!

                 
发表于:2007-08-14 17:40:421楼 得分:0
多写点好不好,每次写一字节,果然扣门:)
发表于:2007-08-14 17:47:552楼 得分:0
用memcpy比较直接

int   len1   =   test1.getlength();
int   len2   =   test2.getlength();

char   *buff1   =   new   char   [len1+1];
cf1.read(buff1,len1);
buff1[len1]   =   '\0 ';

char   *buff2   =   new   char   [len2+1];
cf2.read(buff2,len2);
buff2[len2]   =   '\0 ';

int   len3   =   len1   +   len2   +   1;
char   *buff3   =   new   char   [len3];
memcpy(buff3,buff1,len1+1);
memcpy(buff3+len1,buff2,len2+1);
test.write(buff3,len3);

delete   []buff1;
buff1   =   null;
delete   []buff2;
buff2   =   null;
delete   []buff3;
buff3   =   null;
发表于:2007-08-14 19:43:153楼 得分:0
有个问题是,我的文件可能很大,这样用memcpy好吗,我查了下是从内存复制到内存,会不会太大放不下啊,我不太清楚
发表于:2007-08-14 20:06:524楼 得分:0
看一下text1的尾部的光标在哪里,离文件尾是不是有空行啊,

memcpy可以用,一般的文本文件不会太大,几十、几百k,甚至几m,看你机子了。
要是超过这个,真需要另想办法。
发表于:2007-08-14 20:14:265楼 得分:0
test1是我从数据库导出的,我用ultraedit看test1后边没有空行啊,最后是以换行结尾的,但是不知道为什么,用我的方法复制过来就多了很多空行
发表于:2007-08-14 20:22:306楼 得分:0
最近咋这么多人使用c++文件流哩?
    呵呵,

lz看下这个文件流会不会自己对\r   \n进行处理..
比如说   写的时候   它碰见 '\a '   会自己处理为   '\r   \a '
读的时候   又换成另外一种模式了..不改回来了..

看下c++流有没有  
关于2进制读写   和文本读写的模式的设置,
后者是会进行改写的.2进制读写模式不会.
发表于:2007-08-14 20:53:347楼 得分:0
emptyness(发现贴代码才是硬道理啊.)   说的有道理
我查了下,计算长度的时候,/r/n是两个字节,但是读入的时候只把它们作为了一个字节处理,所以实际能读入buffer的字节数比bytenum要少换行数这么多个,写的时候遇到换行又自己转换成了两个字节,多出的buffer里是存储了换行的字符,所以会处理成换行.
说的很乱,也很外行,见笑了,可是总是找到问题所在了,谢谢大家帮忙!
发表于:2007-08-15 16:58:008楼 得分:0
可以把test1中setfilepointer设置到end,然后把test2的内容读取到内存中,再把它写到test1中即可
发表于:2007-08-15 20:45:589楼 得分:0
加上ios:binary标志就好了,不会处理换行


快速检索

最新资讯
热门点击