复制 文件内容到 另一个文件

huanhuan30 2009-01-07 03:49:43
作业要求 :用 参数和fread()fwrite() 完成
输入 : 程序名字 目标文本 原文本1 原文本2 原文本n (n >= 1)
目标: 将 原文本1 原文本2 原文本n (n >= 1) 的内容复制到 目标文本当中

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define BUFF 1024
void append (FILE *, FILE *);
int main (int argc, char *argv[])
{
int i;
FILE *target, *source;
if (argc <= 3)
{
printf("format: filename target_fliename source_f1 source_f2 source_fn......\n");
exit(EXIT_FAILURE);
}
if ((target = fopen(argv[1], "a")) == NULL)
{
printf("Can't open %s \n", argv[1]);
exit(EXIT_FAILURE);
}
for (i = 2; i < argc; i++)
{
if (strcmp(argv[i], argv[1]) == 0)
{
printf("%s is the same to the target.\n", argv[i]);
continue;
}
else if ((source = fopen(argv[i], "r")) == NULL)
{
printf("Can't open %s \n", argv[i]);
exit(EXIT_FAILURE);
}
else
append(source, target);
fclose(source);
}
fclose(target);
return 0;
}
void append (FILE *source, FILE *target)
{
size_t byte;
static char temp[BUFF];
if ((byte =fread(temp, sizeof(char), BUFF, source)) > 0)
{
fwrite(temp, sizeof(char), BUFF, target);
}
}


不知道哪里错了,总是不能复制文本中的第二行的内容。。而且 保存后 打开目标文本,文本的内容很乱。。
...全文
138 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
太乙 2009-01-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 huanhuan30 的回复:]
C/C++ codevoid append (FILE *source, FILE *target)
{
size_t byte;
static char temp[BUFF];
if ((byte =fread(temp, sizeof(char), BUFF, source)) > 0)
{
fwrite(temp, sizeof(char), BUFF, target); //BUFF 改成 byte 就好了。。晕死。谁能告诉我为什么?
}
}
[/Quote]

fwrite是从temp地址开始,写sizeof(char)*BUFF大小的字节到target文件指针指向buf里!

所以,如果你本身内容没有那么多,那么fwrite还是会从内存里读取那么大的内容写入,所以会出乱码!

故,应该用byte

fread返回的是读取字节数!
ckt 2009-01-07
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define BUFF 1024
void append (FILE *, FILE *);
int main (int argc, char *argv[])//argv第一个参数为exe的路径,由系统写入
{
int i;
FILE *target, *source;
if (argc <= 3)
{
printf("format: filename target_fliename source_f1 source_f2 source_fn......\n");
exit(EXIT_FAILURE);
}
if ((target = fopen(argv[2], "a")) == NULL)
{
printf("Can't open %s \n", argv[1]);
exit(EXIT_FAILURE);
}
for (i = 3; i < argc; i++)// target_fliename 为第四个参数,
{
if (strcmp(argv[i], argv[2]) == 0)
{
printf("%s is the same to the target.\n", argv[i]);
continue;
}
else if ((source = fopen(argv[i], "r")) == NULL)
{
printf("Can't open %s \n", argv[i]);
exit(EXIT_FAILURE);
}
else
append(source, target);
fclose(source);
}
fclose(target);
return 0;
}
void append (FILE *source, FILE *target)
{
size_t byte;
static char temp[BUFF];
if ((byte = fread(temp, sizeof(char), BUFF, source)) > 0)
{
//fwrite(temp, sizeof(char), BUFF, target);//应写入实际读取到的字节数,到尾部可能读取的内容小于缓存大小
fwrite(temp, sizeof(char), byte, target);
}
}

hai040 2009-01-07
  • 打赏
  • 举报
回复
fread返回实际读取的大小
写的时候当然要写byte
huanhuan30 2009-01-07
  • 打赏
  • 举报
回复
void append (FILE *source, FILE *target)
{
size_t byte;
static char temp[BUFF];
if ((byte =fread(temp, sizeof(char), BUFF, source)) > 0)
{
fwrite(temp, sizeof(char), BUFF, target); //BUFF 改成 byte 就好了。。晕死。谁能告诉我为什么?
}
}
用于windows下面的vim编辑器。 给喜欢vim的人使用。详细如下: 好吧,详细点,这里写出一些基本的命令: 【什么是vi】 vi就是linux命令行下的最著名的编辑器之一,(编辑器就是类似windows记事本的功能,不过vi功能比记事本强大无限倍!^_^),现在实际使用的都是vim,它是vi的改进版本,所以现在的vi基本上就是vim了。 【vi能做什么】 第一个功能不用多说,vi可以编辑文本文件。至于其他的功能,多得无法列举,我只说我所知的一些典型的功能应用: (1)编辑文本文件 (2)方便地阅读程序源代码 (3)当文件目录浏览器来用 (4)提供编程、调试环境 (5)利用vi执行一些脚本文件(vi有自己的脚本文件语法) (x)等等等等...... 【vi的操作模式】   vi具有两种基本模式,为输入模式(或插入模式、编辑模式)和指令模式(或命令模式)。输入模式下输入字符,文本就会显示在屏幕上;而指令模式下输入字符就解释为一个输入命令并执行,而不会显示相应的字符。理解指令模式最简单方式就是想象平时剪切、复制以及粘贴数据时所发生的情况。 使用[Esc]键可以停止当前操作(插入或者命令)重新回到指令模式,准备接受新的指令。如果本来就在指令模式下面,将会响铃一下。 【最基本的使用】 这里提供了使用vi得最基本的操作,能够实现大多数的编辑目的。如果你肯花几分钟把“最基本的使用”的内容都实践一下,那么你至少可以独立地在vim中朝你想要得方向“前进”了。如果你不想学习,那么就把它当作一个“字典”吧。 *用vi打开一个文件: 输入“vi filename”. 这里,filename就是你要打开的文件的名字,默认打开文件后vi处于指令模式。 *进入编辑模式编辑打开的文件: 输入“i”. 或输入“a”. 进入编辑模式后,你可以直接敲入想要输入的字符到文件,两者的区别是i在当前字符前面开始插入,a在当前字符后面开始插入。 *退出编辑模式: 输入“[Esc]”. 这样,将返回指令模式,准备接收你要传达给vi的指令并执行,如果之前已经在指令模式下,那么系统将响铃提醒一下。 **以下命令都是在命令模式下进行: *撤销修改: 输入“u”. 这里,相比以前的vi来说,vim支持多步撤销。 *恢复修改: 输入“[Ctrl]r”. 这里,和撤销命令相反,是撤销的撤销,也可多步。 *复制行到剪切板: 输入“yy”. *复制选定内容到剪切板: (1)输入“v”。 (2)按方向键将高亮选择的内容。 (3)输入“y”。 这里,开始输入v使vi临时进入了一个"选择模式",输入方向键可以选择,输入y将选择的内容复制剪切板。 *删除行: 输入“dd”. 注意,vi的删除等价于剪切,删除的内容会保存到剪切板中。 *删除选定内容: (1)输入“v”。 (2)按方向键将高亮选择的内容。 (3)输入“d”。 这里,开始输入v使vi临时进入了一个“选择模式”,输入方向键可以选择,输入d将选择的内容删除。 *粘贴: 输入“p”. 这样会将剪切板的内容粘贴到光标位置或者光标下一行。 *查找字符并定位到第一个匹配处: 输入“/character”. 这里character是待查找的字符,只要先输入/,再输入待查字符,最后回车即可定位到第一个匹配的字符处。 *定位到匹配查找的下一个字符处: 输入“n”. *定位到匹配查找的上一个字符处: 输入“N”. *保存文件: 输入“:w”. 注意w前面的':',输入':'之后,vim会将':'之后的输入解释为待执行的指令。 *退出: 输入“:q”. 这里,如果文件没有保存,将提示无法退出,除非你强制退出,不保存文件,或者保存退出。 *强制退出: 输入“:q!”. *保存退出: 输入“:wq”. 或输入“ZZ”. *察看帮助 输入":help". ** 另外还有一个简易的教程: 输入命令:vimtutor.

70,038

社区成员

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

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