第一个图片是代码,第二个图片是要复制的内容,第三个是复制后的结果,但是多出来三行,如果把64改为1就不会多出三行
![](https://profile-avatar.csdnimg.cn/a011d0908e98402895991216401d63d4_2301_77331351.jpg!4)
利用标准IO实现文件的复制,但是复制文件多出了三行,如果把64改为一就不会
第一个图片是代码,第二个图片是要复制的内容,第三个是复制后的结果,但是多出来三行,如果把64改为1就不会多出三行
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
关注
引自免费微信小程序:皆我百晓生
要解决这个问题,我们首先需要了解原始代码中的错误。在
main
函数中,代码尝试将一个字符数组(ch)复制到另一个文件(fp2)。然而,由于数组长度为max
,每次读取操作都会覆盖之前的值。因此,每次读取后都会导致nember
变量增加。为了修复这个错误,我们需要确保每次读取操作都只添加一个新的字符,并且不修改
ch
数组。我们可以使用fgets()
函数来实现这一目标,因为fgets()
不会改变字符串的末尾。此外,我们还需要将nember
初始化为零,以便在处理完数据之后将其清零。下面是修复后的代码:
#include <stdio.h> #include <string.h> #define MAX 1024 int main(int argc, char *argv[]) { FILE *fp1, *fp2; // 初始化ch数组 char ch[MAX] = {0}; // 检查参数数量 if (argc != 3) { printf("Usage: %s filename1 filename2\n", argv[0]); return 1; } // 打开文件并检查失败 fp1 = fopen(argv[1], "r"); if (!fp1) { perror("Failed to open file"); return 1; } // 打开目标文件并检查失败 fp2 = fopen(argv[2], "w+"); if (!fp2) { perror("Failed to open target file"); fclose(fp1); return 1; } // 复制文件内容 while (fgets(ch, sizeof(ch), fp1)) { fwrite(ch, sizeof(char), strlen(ch), fp2); } // 关闭文件 fclose(fp1); fclose(fp2); return 0; }
这段代码首先打开两个文件,然后分别读取它们的内容。当读取到一行时,它会写入目标文件。这样,每次读取的操作只会添加新的字符,并且不会修改
ch
数组。此外,我们也初始化了nember
变量为零。注意:这段代码假设输入的文件名都是有效的,并且目标文件已经存在于磁盘上。如果实际情况不同,请相应地调整代码。
解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥20 WPF MVVM模式 handycontrol 框架, hc:SearchBar 控件 Text="{Binding NavMenusKeyWords}" 绑定取不到值
- ¥15 需要手写数字信号处理Dsp三个简单题 不用太复杂
- ¥15 数字信号处理考试111
- ¥100 关于#audobe audition#的问题,如何解决?
- ¥15 allegro17.2生成bom表是空白的
- ¥15 请问一下怎么打通CAN通讯
- ¥20 如何在 rocky9.4 部署 CDH6.3.2?
- ¥35 navicat将excel中的数据导入mysql出错
- ¥15 rt-thread线程切换的问题
- ¥15 高通uboot 打印ubi init err 22