我正在尝试解决有关在 C 中将数据从一个文件移动到另一个文件的问题。 运行程序会给出一个segmentation error 11
。我附上了这个问题的图片。习题4
我相信打开文件有问题,我在终端内输入了C代码脚本名称:code.c file1.txt file2.bin -b
。这些文件包含在路径中。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char** argv){
size_t k;
char read1[100] = {};
FILE* s;
FILE* d;
if (argc < 4) {
printf("NA");
exit(1);
}
if (strcmp(argv[4], "-b") == 0) {
printf("binary file outputn");
d = fopen(argv[3], "wb");
if (d == NULL) {
printf("cant open d");
exit(1);
}
} else {
if (strcmp(argv[4], "-t") == 0) {
printf("textual file outputn");
d = fopen(argv[3], "w");
} else {
printf("error");
exit(1);
}
}
s = fopen(argv[2], "r");
if (s == NULL) {
printf("cant open s");
exit(2);
}
k = fread(read1, sizeof(char),100, s);
while (k != 0) {
fwrite(read1, k,1, s);
k = fread(read1, sizeof(char),100, s);
}
fwrite(read1, k,1, s);
fclose(s);
fclose(d);
return 1;
}
我希望将所有数据从file 1
移动到file 2
,file2 output
可以是二进制或文本,具体取决于用户输入流。忽略了"十六进制"大小写。
您似乎想编写一个采用输入文件,输出文件和标志(-b
或-t
)名称的程序,所以我想您是这样调用程序的
program infile outfile [-b|-t]
这是3个参数。它们将分别argv[1]
、argv[2]
和argv[3]
。您不应访问argv[4]
。您的程序将在strcmp(argv[4], "-b")
上出现段错误。你所有的argv[x]
都应该向后移动一个。不过检查if (argc < 4)
还可以。
可能导致分段错误的另一件事是从无效的FILE*
读取。您没有检查在第二次fopen()
之后是否d == NULL
。您应该这样做,并在NULL
的情况下退出错误。
除此之外,代码的其他问题是:
退出
while
循环后,不应调用fwrite
。你知道,当出圈时k == 0
。它无害,但它是无用的,不会打印任何东西。您应该像这样对
fwrite
的参数进行重新排序:fwrite(read1, 1, k, s)
.你最后
return 1
语句没有意义,你应该返回0
,而不是1
,以成功执行程序。您不需要使用
char read1[100] = {};
初始化数组,因为在覆盖其内容之前不会使用它。做char read[100];
就好了。
PS:你应该学会使用GDB来调试你的程序。使用GDB很容易发现这样的问题,只需逐个执行说明即可。