• ベストアンサー

コマンドラインによるファイル名指定

#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行の文字列)の内容を各行を逆順に書き出すプログラムですが、上手くいきません。ご指摘を願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★最初に質問文とソースが曖昧。 ・質問では >各行を逆順に書き出すプログラムですが、上手くいきません。ご指摘を願いします。  ↑  となっていますが  (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 );』でも良い } 以上。

blade3322
質問者

お礼

説明不足の質問にわざわざ丁寧に答えてくれて、ありがとうございました。 おかげさまで無事解決できました。

その他の回答 (3)

  • otaks
  • ベストアンサー率33% (11/33)
回答No.4

#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--) { 動くようにはなりました。

blade3322
質問者

お礼

わざわざ確かめてくださって、ほんとに感謝です。ありがとうございます。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

> fpc = fopen(argv[1],"w"); argcの値を判定せずにargv[1]にアクセスするのは危険です。 コマンドライン引数を与えなかったとき、つまりargcが1のとき、 argv[1]は存在しません。その内容をファイル名とみなして オープンしようとすると、プログラムが異常終了するかもしれません。 > for(i=3;i<0;i--){ 不等号の向きが逆です。

blade3322
質問者

お礼

なるほど、argcの値の判定は必要なものだったんですね。 ただの引数の数を示しているだけかと思いました。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

>上手くいきません。 なぜ「何処が」うまく行かないか書かれないのですか?

blade3322
質問者

お礼

すいません、どこが悪いのか分からなかったので・・・ 今度から気をつけます。ご指摘ありがとうございます。

関連するQ&A