在c - wwwmc中实现'cat'? (我的代码出了什么问题)

时间:2011-11-01 04:04:04

标签: c segmentation-fault fputs

我的代码在某种程度上运行良好。我有两个问题。一,在将文件打印到标准输出的最后,它给我一个分段错误。

二,我不能使用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;
}

2 个答案:

答案 0 :(得分:1)

您在fputs中注释的对concat的调用是试图写入fp,而您只是为阅读而打开,所以毫不奇怪它不会/不会不行。

除此之外,您的阅读循环:while(!feof(fp)) {(除了来自stdin而不是fp之外的类似)遵循熟悉的,广泛的反模式 - 这样的循环不会/不会/不能正常工作。您通常希望在同一操作中阅读并测试成功:

while(fgets(string, 256, stdin))
    fputs(string, stdout);

编辑:我还应该提一下,我希望避免concatstdincat中的代码重复。我宁愿将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