ファイルの行数を計算するプログラムについての質問
- コンパイルソフトがないため、質問内容に基づいてファイルの行数を計算するプログラムを作成した。
- 参考書の作業の流れを説明し、結果が正しく出力されるか質問している。
- 他のプログラムを呼び出した場合も正しく行数が出力されるか疑問を持っている。
- ベストアンサー
コンパイルソフトがないのでよろしくお願いします。
#include <stdio.h> int main(int argc, char *argv[]) { FILE *fp; char gyou[1024]; int gyousuu = 0; if ( argc < 2 ){ printf("file mei ga nai\n"); return -1; } fp = fopen(argv[1], "r"); if ( fp == NULL ){ printf("fopen dekinai\n"); return -2; } while(fgets(gyou, sizeof(gyou), fp) != NULL){ gyousuu++; } fclose(fp); printf("gyousuu=%d\n", gyousuu); return 0; } 以上のプログラムはご覧のとおり、「ファイルの行数を計算」のプログラムです。 参考書には ----------------------------------- ファイル名 ソースファイル example9.c MSYSでコンパイル後のプログラム名 example9.exeとなる。 Mingシェルで呼び出して、同ファイルの 参考書 には $ example9.c -o example9.exe として 実行結果が gyousuu=22 ------------------------------- 以上が参考書の作業の流れです。 ここで質問があります。 参考書は「ファイル行数を計算する」example9.c のファイルを呼び出して gyousuu=22 だと結果を出していますが、ほかのプログラムを呼び出した場合も gyousuu=○○ と出るのでしょうか!? 以上 変な質問かもしれませんが 全国皆様 お付き合いをよろしくお願いいたします。
- Campus2
- お礼率47% (226/475)
- C・C++・C#
- 回答数4
- ありがとう数7
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ほかのプログラムを呼び出すと言っているのは,このプログラムの引数を他のファイルにして実行すると言う意味だと思う。 >#1 そういう意味なら,当然,別のファイルでも動きますよ。なお,引数がテキストファイルでなくバイナリファイルだと行数と言われても困りますと言う状況になるが,とにかく結果は返ってくる。
その他の回答 (3)
- LEVELUP100
- ベストアンサー率40% (183/453)
いつものように単純なタイプミスだとは思うのですが、 >参考書 には >$ example9.c -o example9.exe として >実行結果が これでは操作ができない。 $gcc -o example9.exe example9.c として、「example9.exe」を生成し、 $./example9.exe example9.c として実行するのではないだろうか? 「example9.c」の部分を任意のテキストファイルのファイルネームに置き換えて実際に試してみてください。
補足
ご指摘ありがとうございます。 以下に変更します。 以上のプログラムはご覧のとおり、「ファイルの行数を計算」のプログラムです。 参考書には ----------------------------------- ファイル名 ソースファイル example9.c MSYSでコンパイル後のプログラム名 example9.exeとなる。 Mingシェルで呼び出して、同ファイルの 参考書 には $ example9 example9.exe として 実行結果が gyousuu=22 ------------------------------- 以上が参考書の作業の流れです。
- LEVELUP100
- ベストアンサー率40% (183/453)
「MSYSでコンパイル後のプログラム名・・・」とはなんだろう?と思ってネット検索をしていたらこういうことなのだろうか? >C言語およびC++のコンパイラMinGWのインストールとテスト >http://rei-farms.jp/blog/webmaking/2565/ 結局、Visual Studioは断念されたわけですね。 先日はYouTubeの投稿動画をベースにした質問でしたし、今回はMinGWをベースにした質問ですか? その使用している教本は誰かから購入するように勧められた書籍なのでしょうか? >printf("file mei ga nai\n"); ここの部分を読んで、誰が考案したソースコードなのだろう?と疑問に思いまして。 >以上のプログラムはご覧のとおり、「ファイルの行数を計算」のプログラムです。 いや、質問者のあなたが、「ご覧のとおり」とおっしゃっているそのままなのではないだろうか?
お礼
コンパイラーソフトをご紹介いただきありがとうございました。 暇暇試したいと思います。 しかし現在参考書は292ページまで終了しておりまして、326ページで最後のページです。 必要に迫れば、実施したいと思います。
- kmee
- ベストアンサー率55% (1857/3366)
他のプログラムを実行したこと、これまでも何度もありますよね? そのとき「gyousuu=○○」と出たことありましたか?
関連するQ&A
- 「コマンドライン引数チェック」て何
#include <stdio.h> int main(int argc, char *argv[]) { FILE *fp; char gyou[1024]; int gyousuu = 0; if ( argc < 2 ){ printf("file mei ga nai\n"); return -1; } fp = fopen(argv[1], "r"); if ( fp == NULL ){ printf("fopen dekinai\n"); return -2; } while(fgets(gyou, sizeof(gyou), fp) != NULL){ gyousuu++; } fclose(fp); printf("gyousuu=%d\n", gyousuu); return 0; } 以上のプログラムはご覧のとおり、「ファイルの行数を計算」のプログラムです。 さて以上の if ( argc < 2 ){ printf("file mei ga nai\n"); return -1; } は「コマンドライン引数チェック」を行っています。・・・ if ( argc < 2 ){の「argcは2以上である必要がある」と参考書に書いてあります。 以上ですが意味が日光手前ですが、プログラムの行数をカウントするうえで、 「コマンドライン引数チェック」とはどんな作業を行っているとこなのでしょうか!? よろしくお願いします。
- ベストアンサー
- C・C++・C#
- 探索アルゴリズム
テキストファイルを読み込んで、該当する文字列を含む行を表示するというプログラムを作りたいのです。ファイルを読み込むことはできるのですが、該当する文字列を含む行を表示するやり方がわかりません。どなたか助けてもらえないでしょうか? 一応私が作ってみたプログラムはこんな感じになったんですけど・・・ #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { FILE *fp; char ch; if( argc != 3) { printf(" 使用法 : <プログラム名> <ファイル名> <文字> \n"); return -1; } if((fp = fopen(argv[1],"r")) == NULL) { printf("ファイルを開くことができません\n"); return -1; } while(( ch = fgetc(fp)) != EOF) if(ch == *argv[2]) { printf("%cが見つかりました\n",ch); break; } fclose(fp); return 0; }
- 締切済み
- C・C++・C#
- fscanf
fscanfを使って、ファイル(普通の英文が入っています)から一単語ずつ読み込んでいきたいと思っているのですが、どうすれば良いのかわかりません。 int main(int argc,char *argv[]){ FILE *fp; char *word; fp = fopen(argv[1], "r"); if(fp == NULL){ printf("error: not open file.\n"); return(0) ;} while( ){ fscanf(fp,"%[a-zA-Z]",word); printf("%s\n", word); fflush(stdout); } fclose(fp); return 0; } とりあえず上の様なプログラムで、一単語ずつ順番に単語を出力できるようにしたいと思っているのですが。 いろいろ変なところなど在ると思いますが、whileの条件など、どうすればよいか教えてください。
- 締切済み
- C・C++・C#
- エラーが出ます
12,51,13,123,133,551,… というコンマで区切られているファイルを読み込みたいです。数字は100文字です。どう書けば全部読み込めるでしょうか? よろしくお願いします。 int main(int argc,char *argv[ ]){ int line; int i; FILE *fp; fp = (argc > 1)? fopen(argv[1],"r"): stdin; if(fp==NULL){ perror("fopen"); exit(0); } while(fscanf(fp,"%d",&line) != EOF){ printf("%d\n") } if(argc>1){ fclose(fp); }
- 締切済み
- C・C++・C#
- コマンドライン入力
以下のプログラムはまず、 1 a.datファイルを作る。 2 コマンドラインから、a.datを指定。 指定場所の文字を読み取るコードです。 何度やっても、意味不明な記号などがでます。 どこがおかしいか 教えてください。 /**************** a.datファイルの作成 ***********/ /***************** プログラム **************/ int main(void) { char a[ ]= "abcde"; FILE *fp; fp=fopen("a.dat","wb"); fwrite(a,sizeof(a),1,fp); return 0; } /*************** コマンドラインから指定 **************/ /*************** 指定の場所を書き出す ****************/ int main( int argc,char *argv[ ] ) { long a; FILE *fp; fp=fopen("argv[1]","rb"); printf("バイト数入力\n"); scanf("%ld",&a); fseek(fp,a,SEEK_SET); printf("%c\n",fgetc(fp)); return 0; }
- ベストアンサー
- C・C++・C#
- ファイルの内容の表示
実行時のコマンドライン引数で指定したファイルの内容を、行番号付きで画面に表示するプログラムを作る という問題です。ヒントも与えられています。 行番号付きの表示、コマンドライン引数の利用。両者を組み合わせればできるはずだ > 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; } です。コマンドライン引数は表示されるのですが、行番号が表示されません。どうしたらいいでしょうか??
- ベストアンサー
- C・C++・C#
- 任意のファイルを別のファイルにコピーするプログラム。
コマンドラインからコピー元、コピー先ファイル名を指定してファイルをコピーするプログラムなんですが… #include <stdio.h> #include <stdlib.h> main(int argc, char *argv[]) { FILE *fp; if ((fp = fopen(argv[0],"r") == NULL){ printf("ファイル%sが存在しません。\n",argv[0]);exit(-1); } if ((fp = fopen(argv[1],"w") == NULL){ printf("ファイル%sがコピーできません。\n",argv[1]);exit(-1); } fclose(fp); } どこか間違っているところがあるでしょうか? ありましたら詳しく教えてもらえると幸いです。 少し自信がないのでわかる方はよろしくおねがいします。
- ベストアンサー
- C・C++・C#
- Cでファイルの行数をカウントするには
ファイルの中の行数をカウントするにはどうすればよいか プログラムの行数ならその行数分だけ またコメントや空白行もカウントするにはどうしたらよいか 以下のプログラムに追加したい場合どうしたらよいか教えてください。 #include <stdio.h> int main(int argc , char *argv[]){ char s[256]; int i; FILE *fin; int local; int nCount = 0; for(i = 1 ; i < argc ; i++){ printf("%s\n",argv[i]); local = 0; fin=fopen(argv[i],"r"); memset(s,0,sizeof s); while(fgets(s,sizeof s,fin) != NULL){ // printf("%s",s); local++; nCount++; } memset(s,0,sizeof s); while(fgets) printf("local count = %d\n",local); fclose(fin); } printf("grobal count = %d\n",nCount); return 0; }
- 締切済み
- C・C++・C#
- C言語、ファイル操作、fgets()について
次のプログラムは入力された行を読み込み、コマンドラインで指定されたファイルに書き込みます。 空白行が入力されたら、入力の終了とみなしてファイルを閉じます。続いてファイルを入力用に開き、 fgets()を使ってファイルの内容を表示するものです。 (ソースコードが長くてすみません) #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { FILE *fp; char str[80]; /* コマンドライン引数を検査する */ if(argc!=2) { printf("ファイル名を指定してください\n"); exit(1); } /* 出力用にファイルを開く */ if((fp = fopen(argv[1], "w"))==NULL) { printf("ファイルを開くことができません\n"); exit(1); } printf("終了するには空白行を入力してください\n"); do { printf(": "); gets(str); strcat(str, "\n"); /* 改行を追加する */ if(*str != '\n') fputs(str, fp); } while(*str != '\n'); fclose(fp); /* 入力用にファイルを開く */ if((fp = fopen(argv[1], "r"))==NULL) { printf("ファイルを開くことができません\n"); exit(1); } /* ファイルを読み込み直す */ do { fgets(str, 79, fp); if(!feof(fp)) printf(str); } while(!feof(fp)); fclose(fp); return 0; } 【質問】fgets()内のint型の数値「79」がどうして79なのかが分かりません。 80でも良いような気がするのですが・・・
- ベストアンサー
- C・C++・C#
- ファイルの出力
コマンドラインで指定したファイルの内容を一行ずつ表示するプログラムです。一行表示するごとに次の行も表示するか尋ねます。 #include<stdio.h> #include<stdlib.h> #include<ctype.h> int main(int argc, char *argv[]) { FILE *fp; char str[80]; char ch; if (argc != 2){ printf("コマンドライン引数が違います\n"); exit(1); } if ((fp = fopen(argv[1],"r")) == NULL){ printf("ファイルが開けません"); exit(1); } while(!feof(fp)){ fgets(str, 79, fp); if (!feof(fp)) printf("%s",str); printf("追加しますか?(y/n)"); gets(str); if ( toupper(*str) == 'N') break; printf("\n"); } if (fclose(fp) == EOF){ printf("ファイルを閉じれません\n"); exit(1); } return 0; } while文の gets(str); if ( toupper(*str) == 'N') break; この部分を ch = getchar(); if ( toupper(ch) == 'N') break; でやると上手く実行できないのですが、なぜでずか?
- ベストアンサー
- C・C++・C#
お礼
ご回答誠にありがとうございました。^^ A:当然,別のファイルでも動きますよ。 そこが私が一番知りたいところでした。 コンパイルできようが、できまいか、問題ではありません! プログラムの理論を勉強中することと、コンパイルのソフトの動作の有無は別問題だからです。