[求助]文件复制问题。

tongzhipeng5699 2012-05-28 12:37:19
文件复制的时候,发现只要源文件最后以一个空行结束,最后目标文件必定要比源文件多1行空行,如果文件不是以回车空行结尾,那么复制是正常的。求高人解答!并告知解决方法!

#include <stdio.h>

int main(void) {
FILE* fp1=fopen("src.txt","r");
if(fp1==NULL) {
printf("open file failed\n");
}
FILE* fp2=fopen("des.txt","w");
if(fp2==NULL) {
printf("open file failed\n");
}
char buf[1024];
long pos;
while(fread(&buf,sizeof(buf),1,fp1)) {
pos=ftell(fp1);
fwrite(&buf,sizeof(buf),1,fp2);
}
if(feof(fp1)) {
fseek(fp1,pos,SEEK_SET);
char temp;
while(!feof(fp1)) {
fread(&temp,sizeof(char),1,fp1);
fwrite(&temp,sizeof(char),1,fp2);
}
}else {
printf("write file failed\n");
}
return 0;
}
...全文
132 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
tongzhipeng5699 2012-05-30
  • 打赏
  • 举报
回复
谢谢大家的回复,虽然心中疑惑仍然未解,但是拖着不结贴毕竟不厚道...
景语 2012-05-29
  • 打赏
  • 举报
回复
你确定只是多了个空格?!
我在ubuntu下跑,整个文件数据都出错了。

对于你使用的fread和fwrite的地方心存疑虑
参考下http://www.cplusplus.com/reference/clibrary/cstdio/fwrite/的示例程序
赵4老师 2012-05-29
  • 打赏
  • 举报
回复
不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了

system("copy \"源文件全路径名\" \"目的文件全路径名\"");
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
JAYXIANJIAN 2012-05-29
  • 打赏
  • 举报
回复
神啊!
angel_su 2012-05-29
  • 打赏
  • 举报
回复
fread后应该要立刻feof()或者检测返回值,但你都是直接fwrite肯定要多写东西进去啦。另外用到fread,fseek等,最好是用2进制模式处理文件吧...
ForestDB 2012-05-28
  • 打赏
  • 举报
回复
char buf[1024];
把这个buf初始化一下:
char buf[1024] = "";

这个问题我原来也遇到过,还想着看看源代码来了解下是怎么回事。

希望红星们有时间能一起看一下。
tongzhipeng5699 2012-05-28
  • 打赏
  • 举报
回复
恩,也试过了,不行,可能因为文件本身是文本格式,用二进制方式打开也没用
[Quote=引用 5 楼 的回复:]

你用二进制读写的方法试试,rb,wb
[/Quote]
  • 打赏
  • 举报
回复
你用二进制读写的方法试试,rb,wb
tongzhipeng5699 2012-05-28
  • 打赏
  • 举报
回复
呵呵,我需要费心的东西可多了,毕竟是初学者,不是你这样的大牛。
我用你的方法发现成功了,问题解决了,但是我想知道原因,能给我解惑吗?谢谢。
tongzhipeng5699 2012-05-28
  • 打赏
  • 举报
回复
我的环境是UBUNTU的,也会这样吗?
而且并不是所以的换行都出这个问题,中间的不要紧,只有最后一行的换行有问题,也就是其后紧接EOF标识符的那一次空行换行有问题。
[Quote=引用 1 楼 的回复:]

WINDOWS下写入回车时会自动加入换行~所以如果你写入回车换行符\r\n,那就变成了\r\n\n~所以就换成了两行,暂时我也没找到方法解决……你可以手动判断回车换行然后只写入回车
[/Quote]
qq120848369 2012-05-28
  • 打赏
  • 举报
回复
原来复制一个文件都让楼主费心了.

while (fread() == 1) {
fwrite();
}
Corner 2012-05-28
  • 打赏
  • 举报
回复
WINDOWS下写入回车时会自动加入换行~所以如果你写入回车换行符\r\n,那就变成了\r\n\n~所以就换成了两行,暂时我也没找到方法解决……你可以手动判断回车换行然后只写入回车
tongzhipeng5699 2012-05-28
  • 打赏
  • 举报
回复
我这里的情况,初始化还是没用。
[Quote=引用 7 楼 的回复:]

char buf[1024];
把这个buf初始化一下:
char buf[1024] = "";

这个问题我原来也遇到过,还想着看看源代码来了解下是怎么回事。

希望红星们有时间能一起看一下。
[/Quote]

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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