2011-11-01 4 views
0

私のコードはうまく動作します。私はそれに2つの問題がある。 1つは、ファイルを標準出力に出力する最後に、私にセグメンテーションエラーが発生します。c - wwwmcで 'cat'を実装していますか? (私のコードで何が問題なのですか)

2つ目は、すぐにセグメンテーション違反が発生するため、fputsを使用してデータを印刷することはできません。だから私はそれをうまく印刷するputsを使用しますが、最後にsegフォールトと同様に間隔を置いて1行のテキストを作るすべての行の後に '\ 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; 
} 

答えて

1

あなたはconcatでコメントアウトしているfputsへの呼び出しは、あなただけの読み取りのために開かれたfp、に書き込もうとしているので、それは/動作しませんしないという驚きではありません。それ以外

、あなたの読書ループ:while(!feof(fp)) {(代わりにfpstdinから除くと同様に)続くおなじみの、広範なアンチパターン - このようなループは、/ /正しく動作しないことができなくなりません。あなたは、通常、同じ操作で読み、成功のためのテストしたい:

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

編集:私はまた、私はconcatstdincatのコードの重複を避けることを好むだろうと言及する必要があります。私はむしろあなたがstdinから、あるいは他の任意のファイルからの読み込みに同じコードを使用すると思いますので、パラメータとしてからの読み取りにFILE *を渡したい:あなたがしている場合

// 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がより適切であり得る。読んでいる間は、バイナリモードの読み書きも可能です。

+0

感謝をfputsための標準出力を使用する必要があり、あなただけの読み取りのために開かれたストリームに書き込むことはできません! fgetsの問題は、単にブラインドコーディングでした。それは私がそれを見ていないことが恥ずかしいです。 すべてが今動作します。ありがとう! – jonalmeida

0

あなたは、関数CONCATで

関連する問題