我的代码在某种程度上运行良好。我有两个问题。一,在将文件打印到标准输出的最后,它给我一个分段错误。
二,我不能使用fput打印出数据,因为我马上得到了一个分段错误。所以为了修复它,我使用了可以打印它的put,但是在每行之后添加'\ n',使文本单行间隔以及最后的seg错误。
#include <stdio.h>
#include <string.h>
void concat(char *arg){
char string[256];
FILE *fp = fopen(arg, "r");
while(!feof(fp)){
fgets(string, 256, fp);
//fputs(string, fp);
puts(string);
}
fclose(fp);
}
void stdincat(){
char string[256];
while(!feof(stdin)){
fgets(string, 256, stdin);
fputs(string, stdout);
}
}
int main(int argc, char *argv[]){
char argvalues[256][40];
if(argv[1] == NULL)
stdincat();
else if(argv[1] != NULL){
int i;
for(i=1;i<=(argc);i++){
concat(argv[i]);
}
}
return 0;
}
答案 0 :(得分:1)
您在fputs
中注释的对concat
的调用是试图写入fp
,而您只是为阅读而打开,所以毫不奇怪它不会/不会不行。
除此之外,您的阅读循环:while(!feof(fp)) {
(除了来自stdin
而不是fp
之外的类似)遵循熟悉的,广泛的反模式 - 这样的循环不会/不会/不能正常工作。您通常希望在同一操作中阅读并测试成功:
while(fgets(string, 256, stdin))
fputs(string, stdout);
编辑:我还应该提一下,我希望避免concat
和stdincat
中的代码重复。我宁愿将FILE *
作为参数传递给您,因此您可以使用相同的代码从stdin
或其他任意文件中读取:
// Warning: untested code.
// error checking omitted for readability.
void catfile(FILE *file) {
char line[256];
while (fgets(line, sizeof(line), file))
puts(line);
}
int main(int argc, char **argv) {
int i;
if (argc == 1)
catfile(stdin);
else for (int i=1; i<argc; i++) {
FILE *infile = fopen(argv[i], "r");
catfile(infile);
fclose(infile);
}
return 0;
}
最后,我要注意,如果您要复制整个文件,fgets
可能 是最有效的工作方式。 fread
可能更合适。当你在这里时,你也可以使用二进制模式读写。
答案 1 :(得分:0)
您不能在仅为读取而打开的流上编写,您应该在函数concat中使用stdout作为fputs