0

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

第二,我不能使用 fputs 来打印数据,因为我马上就遇到了分段错误。所以要修复它,我使用 puts 打印它很好,但在每一行之后添加一个 '\n' 使文本单行间隔以及最后的段错误。

#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;
}
4

2 回答 2

1

fputs已注释掉的对您的调用concat正在尝试写入fp,您打开它只是为了阅读,因此它不会/不起作用也就不足为奇了。

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

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

编辑:我还应该提到,我宁愿避免在concat和中重复代码stdincat。我宁愿将FILE *to read from 作为参数传递,因此您可以使用相同的代码来读取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可能更合适。当您使用它时,您也可以使用二进制模式读取和写入。

于 2011-11-01T04:12:09.910 回答
0

您不能在仅为读取而打开的流上写入,您应该使用 stdout 作为函数 concat 中的 fputs

于 2011-11-01T04:12:15.707 回答