プロが教えるわが家の防犯対策術!

実行時のコマンドライン引数で指定したファイルの内容を、行番号付きで画面に表示するプログラムを作る

という問題です。ヒントも与えられています。
行番号付きの表示、コマンドライン引数の利用。両者を組み合わせればできるはずだ
>  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;
}

です。コマンドライン引数は表示されるのですが、行番号が表示されません。どうしたらいいでしょうか??

A 回答 (3件)

とりあえず。


> 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();
を複数呼ばないとだめだね。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/01/20 00:13

「改行チェック」ってなんだろう.


しかし, このようなプログラムで fgets を使うことに違和感がある. 普通に fgetc を使うものではないかな.
    • good
    • 0
この回答へのお礼

コメントありがとうございます。

授業での問題なのですが、fgetcは教わらなかったんです・・・

お礼日時:2010/01/20 00:12

put_file(i);



「i」はいつからファイル名になったの?

put_file(argv[i-1]);

じゃないと、ファイル名が渡らない…。
※「-1」しているのは既にforループでインクリメントされているから。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

もう一つ聞きたいんですが、これでこの問題の題意は満たされていますか?

今動かしたんですけど、a sで動かしました。
argv[0]はaです
argv[1]はsです
となります。
しかし行番号付きということなので、
1;argv[0]はaです
2;argv[1]はsです
としなければいけないんじゃないでしょうか?

ちなみにこうしなければいけないならば、どのように変えればよいでしょうか?

お礼日時:2010/01/19 21:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!