• ベストアンサー

ファイルの内容の表示

実行時のコマンドライン引数で指定したファイルの内容を、行番号付きで画面に表示するプログラムを作る という問題です。ヒントも与えられています。 行番号付きの表示、コマンドライン引数の利用。両者を組み合わせればできるはずだ >  main関数の引数にargcとargvを指定して、コマンドライン引数をファイル名として利用する。キーボード入力を促す文(プロンプト)や改行チェックは不要なので書かないこと >  コマンドライン引数が指定されない場合は、メッセージを表示してプログラムを終了 >  ファイルの内容を画面表示する処理は、ユーザー定義関数put_file_contentsに記述する。仮引数には文字型のポインタ変数をひとつ指定し、ファイル名を受け渡せるようにする。put_file_contents自体の型は整数型(int)で、正常終了なら返り値0を返すこと。 行番号付きのプログラム#include<stdio.h> > int put_file(char *filename); > > int main() > { > char line[50]; > char *ptr; > > printf("ファイル名を入力:"); > fgets(line,sizeof(line),stdin); > ptr = line + strlen(line) - 1; > if(*ptr == '\n') { > *ptr = '\0'; > } > > put_file(line); > > return 0; > } > > int put_file(char *filename) > { > FILE *fp; > char buf[100]; > int line_no; > > fp = fopen(filename,"r"); > if (fp == NULL){ > printf("%sを開けません\n",filename); > return 1; > } > line_no = 1; > while (fgets(buf,sizeof(buf),fp) != NULL){ > printf("%3d: ",line_no); > printf("%s",buf); > line_no++; > } > fclose(fp); > > return 0; > } で、コマンドライン引数のプログラムは#include<stdio.h> void write_key_inputs(char *filiname); int main(int argc, char *argv[1]) { write_key_inputs(argv[1]); return 0; } void write_key_inputs(char *filename) { FILE *fp; char buf[100] ; fp = fopen(filename,"w"); while(fgets(buf, sizeof(buf),stdin) != NULL) { fputs(buf, fp); } fclose(fp); return ; } です。これらを組み合わせて少しいじると出来るみたいなのですが、できていません。ちなみに私が考えたプログラムは #include<stdio.h> int put_file_contents(char *filename); int main(int argc,char *argv[]) { int i; if(argc == 1){ printf("コマンドライン引数がありません\n"); return 1; } for(i = 0;i<argc;i++) printf("argv[%d]は「%s」です\n",i,argv[i]); put_file(i); return 0; } int put_file(char *filename) { FILE *fp; char buf[100]; int line_no; fp = fopen(filename,"r"); line_no = 1; while (fgets(buf,sizeof(buf),fp) != NULL){ printf("%3d: ",line_no); printf("%s",buf); line_no++; } fclose(fp); return 0; } です。コマンドライン引数は表示されるのですが、行番号が表示されません。どうしたらいいでしょうか??

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

  • ベストアンサー
回答No.2

とりあえず。 > int put_file(char *filename) はint put_file_contents(char *filename) だね。 > for(i = 0;i<argc;i++) > printf("argv[%d]は「%s」です\n",i,argv[i]); は削除。 > if (fp == NULL){ > printf("%sを開けません\n",filename); > return 1; > } は追加(なぜ消したんだろう?)。 あとは指定したファイルに100文字以上の行があったらまずいね。 >改行チェックは不要なので ならいいのかな? 指定できるファイルは1つだけかな? なら > if(argc == 1){ は if(argc != 2){ だね。 もし複数指定したいなら。 put_file(); を複数呼ばないとだめだね。

su-sen
質問者

お礼

なるほど。今、確認しました。ありがとうございます。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

「改行チェック」ってなんだろう. しかし, このようなプログラムで fgets を使うことに違和感がある. 普通に fgetc を使うものではないかな.

su-sen
質問者

お礼

コメントありがとうございます。 授業での問題なのですが、fgetcは教わらなかったんです・・・

  • edomin7777
  • ベストアンサー率40% (711/1750)
回答No.1

put_file(i); 「i」はいつからファイル名になったの? put_file(argv[i-1]); じゃないと、ファイル名が渡らない…。 ※「-1」しているのは既にforループでインクリメントされているから。

su-sen
質問者

お礼

回答ありがとうございます。 もう一つ聞きたいんですが、これでこの問題の題意は満たされていますか? 今動かしたんですけど、a sで動かしました。 argv[0]はaです argv[1]はsです となります。 しかし行番号付きということなので、 1;argv[0]はaです 2;argv[1]はsです としなければいけないんじゃないでしょうか? ちなみにこうしなければいけないならば、どのように変えればよいでしょうか?