- ベストアンサー
コマンドラインによるファイル名指定
#include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) { FILE *fp,*fpc; int i=0; char line[1000]; fp = fopen("test.txt","r"); if(fp == NULL) { printf("File not found.\n"); exit(1); } fpc = fopen(argv[1],"w"); if(fpc==NULL){ fprintf(stdout,"Can not open file.\n"); exit(1); } while(fgets(line[i],1000,fp)!=NULL){ i++; } for(i=3;i<0;i--){ fprintf(fpc,"%s",line[i]); } fclose(fp); fclose(fpc); return 0; } コマンドラインでファイル名を指定し、そのファイルに、test.txt(4行の文字列)の内容を各行を逆順に書き出すプログラムですが、上手くいきません。ご指摘を願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
★最初に質問文とソースが曖昧。 ・質問では >各行を逆順に書き出すプログラムですが、上手くいきません。ご指摘を願いします。 ↑ となっていますが (1)各行の文字列を逆順に書き出すのか? (2)行単位で行順を逆順に書き出すのか? 分かりにくいです。 ・ソースでは(2)の行単位で行順を逆順に書き出すように見えます。 この場合は回答者 No.2 さんの仰るとおりで >不等号の向きが逆です。 ↑ それともう一つの問題は line 配列の宣言です。 正しくは二次配列で宣言すべきです。 ・つまり下のようになります。 サンプル:行単位で逆順の場合 char line[ 10 ][ 1000 ]; ←10行×1000文字の二次配列 // 読み込む部分のみ for ( i = 0 ; i < 10 ; i++ ){ ←この方が安全。 if ( fgets(line[i],1000,fp) == NULL ){ ←『fgets(line[i],sizeof(line[i]),fp)』でも良い break; } } // ここで逆順に出力 for ( i-- ; i >= 0 ; i-- ){ ←不等号の向きに注意! fprintf( fpc, "%s", line[i] ); ←『fputs( line[i], fpc );』でも良い } 以上。
その他の回答 (3)
- otaks
- ベストアンサー率33% (11/33)
#include<stdio.h> #include<stdlib.h> int main (int argc, char *argv[]) { FILE *fp, *fpc; int i = 0; char line[20][1000]; fp = fopen ("test.txt", "r"); if (fp == NULL) { printf ("File not found.\n"); exit (1); } fpc = fopen (argv[1], "w"); if (fpc == NULL) { fprintf (stdout, "Can not open file.\n"); exit (1); } while (fgets (line[i], 1000, fp) != NULL) { i++; } for (i = 3; i >= 0; i--) { fprintf (fpc, "%s", line[i]); } fclose (fp); fclose (fpc); return 0; } 修正部分は char line[1000]; ↓ char line[20][1000]; こうしないとwhileでの使い方と一致しないので・・ for(i=3;i<0;i--){ ↓ for (i = 3; i >= 0; i--) { 動くようにはなりました。
お礼
わざわざ確かめてくださって、ほんとに感謝です。ありがとうございます。
- asuncion
- ベストアンサー率33% (2127/6289)
> fpc = fopen(argv[1],"w"); argcの値を判定せずにargv[1]にアクセスするのは危険です。 コマンドライン引数を与えなかったとき、つまりargcが1のとき、 argv[1]は存在しません。その内容をファイル名とみなして オープンしようとすると、プログラムが異常終了するかもしれません。 > for(i=3;i<0;i--){ 不等号の向きが逆です。
お礼
なるほど、argcの値の判定は必要なものだったんですね。 ただの引数の数を示しているだけかと思いました。
- koko_u_
- ベストアンサー率18% (459/2509)
>上手くいきません。 なぜ「何処が」うまく行かないか書かれないのですか?
お礼
すいません、どこが悪いのか分からなかったので・・・ 今度から気をつけます。ご指摘ありがとうございます。
お礼
説明不足の質問にわざわざ丁寧に答えてくれて、ありがとうございました。 おかげさまで無事解決できました。