0

私のコードはある意味でうまく機能します。ただし、2つの問題があります。1 つは、ファイルを標準出力に出力したときに、セグメンテーション違反が発生することです。

2 つ目は、すぐにセグメンテーション違反が発生するため、fputs を使用してデータを出力できないことです。だからそれを修正するために、私はそれをうまく印刷するプットを使用しますが、すべての行の後に「\ n」を追加して、テキストを1行間隔にし、最後にセグフォルトを作成します。

#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、機能しない/機能しないことは驚くことではありません。

それ以外は、あなたの読書ループ: (および fromの代わりにwhile(!feof(fp)) {from を除いて同様のもの) は、おなじみの広く普及しているアンチパターンに従います。このようなループは、正しく動作しない/動作しない/動作しません。通常、同じ操作で読み取りと成功のテストを行います。stdinfp

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

読み取り専用に開いたストリームに書き込むことはできません。関数 concat の fputs には stdout を使用する必要があります。

于 2011-11-01T04:12:15.707 に答える