关于文件复制的问题

justthis 2007-08-14 05: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呢?或者大家还有什么好的方法能够使两个文件拼接到一起?谢谢大家回答!


...全文
785 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
echoher 2007-08-15
  • 打赏
  • 举报
回复
加上ios:binary标志就好了,不会处理换行
liu280531510 2007-08-15
  • 打赏
  • 举报
回复
可以把test1中setfilepointer设置到end,然后把test2的内容读取到内存中,再把它写到test1中即可
justthis 2007-08-14
  • 打赏
  • 举报
回复
emptyness(发现贴代码才是硬道理啊.) 说的有道理
我查了下,计算长度的时候,/r/n是两个字节,但是读入的时候只把它们作为了一个字节处理,所以实际能读入Buffer的字节数比ByteNum要少换行数这么多个,写的时候遇到换行又自己转换成了两个字节,多出的buffer里是存储了换行的字符,所以会处理成换行.
说的很乱,也很外行,见笑了,可是总是找到问题所在了,谢谢大家帮忙!
emptyness 2007-08-14
  • 打赏
  • 举报
回复
最近咋这么多人使用c++文件流哩?
呵呵,

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

看下C++流有没有
关于2进制读写 和文本读写的模式的设置,
后者是会进行改写的.2进制读写模式不会.
justthis 2007-08-14
  • 打赏
  • 举报
回复
test1是我从数据库导出的,我用ultraEdit看test1后边没有空行啊,最后是以换行结尾的,但是不知道为什么,用我的方法复制过来就多了很多空行
fronz 2007-08-14
  • 打赏
  • 举报
回复
看一下TEXT1的尾部的光标在哪里,离文件尾是不是有空行啊,

MEMCPY可以用,一般的文本文件不会太大,几十、几百K,甚至几M,看你机子了。
要是超过这个,真需要另想办法。
justthis 2007-08-14
  • 打赏
  • 举报
回复
有个问题是,我的文件可能很大,这样用memcpy好吗,我查了下是从内存复制到内存,会不会太大放不下啊,我不太清楚
yangshu4836 2007-08-14
  • 打赏
  • 举报
回复
用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;
Bear520leon 2007-08-14
  • 打赏
  • 举报
回复
多写点好不好,每次写一字节,果然扣门:)

16,547

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧