• 締切済み

【至急:C言語】cppファイルやhファイルなどテキストファイルのステッ

【至急:C言語】cppファイルやhファイルなどテキストファイルのステップ数を求めるプログラムに関して。 ファイルパスを標準入力させ、fopen()で開きます。その場合、選択されたファイルがテキストファイルでない場合の例外処理はどうすればできるでしょうか?テキストファイルといっても、冒頭に挙げたcpp, hのほかにtxt, ini, datなどさまざまです。fgets()などの関数を使ってステップを数えられるファイルを正常処理の対象とするプログラムを考えています。(できるだけ短い時間で多くの回答をいただきたく、Yahoo知恵袋でも同様の質問を投稿させていただいております)

みんなの回答

回答No.7

(1) 「cppファイルやhファイルなどテキストファイルのステップ数を求める」という仕様にあいまいさがあると思います。 テキストファイルは、さらに、 Shift-JIS UTF8 UTF16 など、文字コードの種類によって分類することができます。 まず、どんな種類のテキストファイルに対応しなければならないか、を決めてはどうでしょう。 それ以外のファイルは、テキストファイルであれ、バイナリファイルであれ、例外の対象になります。 (2) ほんとうに例外処理をする必要がありますか? 仕様の条件がいろいろあると思いますが、 「例外処理はしない」というのも選択肢になると思います。

  • R32C
  • ベストアンサー率39% (115/290)
回答No.6

とりあえず、参考URLに方法がいくつか載っています。 しかし、この課題そのものがいかがなものかと思います。 使うことを目的とするなら かぞえチャオ あたりを使えばよいです。 研修目的だとするなら、バイナリ等の判定は、課題として不要のように 思います。 まぁ、UNIX環境(WindowsならCygwin等)で、fileコマンドを呼びだして判定することが可能かもしれま せんが、そういう回答でいいんでしょうか?

参考URL:
http://d.hatena.ne.jp/oooooooo/20050113/p5
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.5

とりあえず単純にやるなら、改行とタブ以外のコントロールコードを含まないファイルを対象にすればいいかと。 それで漏らしが出るようだったら、そのつど処理を追加していけばいいと思います。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.4

そもそもファイル種別というのは「扱うプログラム側の解釈/都合」に過ぎませんから、中身を見ずして「実際にそのファイルがテキストファイルとして扱えるか否か」を判断するのは不可能です。

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.3

調査目的なんだったら、対象を拡張子で判別しますね。 調査対象が明確になるので。

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

そもそも「テキストファイル」と「テキストファイルでないファイル」ってどう区別するの?

  • trapezium
  • ベストアンサー率62% (276/442)
回答No.1

バイナリかテキストファイルの区別よりも、真面目に処理するなら、自力か yacc, lex (bison, flex) などで構文解析して、C や C++ と思われるファイルかチェックするしかないと思う。当然、コメントや空行などは除外しなきゃならないでしょうし、ただの { や } だけの行もどうなのって話になりますから。

関連するQ&A

  • C言語でファイルを出力

    ファイルの中に変数をいれて複数のファイルをつくろうとしたのですが、 できたファイルの後に?マークがついてきます。 file = fopen("filename.txt", "w"); for(j=0; j<30; j++){ fprintf(file ,"%d.dat\n",j ); } fclose(file); file2 = fopen("filename.txt", "r"); として、ファイル名を書いたファイルをつくってから、 for(k=0; k<30; k++){ fgets(fp,sizeof(fp),file2); file_out = fopen(fp,"w"); 省略 fprintf(file_out, %e %e \n",a ,b); fclose(file_out); } fclose(file2); をして、30個のファイルを出力すると、 0.dat? 1.dat? 2.dat? . . . 29.dat? というファイルができてしまいます。 ファイルの中はしっかりできています。 なにか解決法を知っている方がおりましたら、どうか教えて下さい。

  • C言語のファイル読み込みに関して。

    英文を入力したテキストファイルを読み込むプログラムをつくっているのですが、 ファイル読み込みが上手くできません。 #include<stdio.h> main() { char filename[33]; char sty[512]; FILE *fp; printf("FILENAME: "); fgets(filename, 33, stdin); //読み込むテキストファイルを指定 fp = fopen(filename,"r"); if(fp == NULL){ printf("Can't open the file!\n"); return -1; } fgets(sty, 512, fp); fclose(fp); printf("%s\n",sty); } このプログラムなのですが、どうしても"Can't open the file!"が表示されてしまいます。 どうすればいいのでしょうか?

  • C言語

    C言語で簡単なプログラムを作っているのですが、 「テキストファイルが存在し、かつ空のテキストファイル(開いても何も書かれていない)だと、そのテキストファイルを削除する」 というコードはどうのように書けばいいのでしょうか? 現在自分が考えているのは、 #include<stdio.h> int main(){ FILE *fp; if((fp=fopen("example.txt","r"))==NULL){ printf("file not open\n"); }else if(((fp=fopen("example.txt","r"))!=NULL)&&(fgetc(fp)==NULL)){ //「ファイルがあって、中に何も書かれていない」という条件式を書きたい// remove("example.txt"); } return 0; } 大学で講義としてC言語を習っている程度の知識です。 fopenのif文の書き方があってるかどうかもわからないんですが^^; borland c++ 5.5.1を使用しています。 よろしくお願いします。

  • テキストファイルへ半永久的に出力し続けることは可能でしょうか。

    こんにちは。いつもお世話になっております。 C言語で、半永久的に文字列をテキストファイルに出力し続ける、という事は可能でしょうか。要は、ファイルを無限に更新し続けるプログラムを書きたいと考えています。元のファイル(file.txt)の文字列を、形式を変えて、別のファイル(out.txt)に出力し続けたいのですがどうしても出力が止まってしまい上手くいきません。自分なりに以下のようなプログラムを作ってみました。何かアドバイスを頂けないでしょうか。 前提条件: ・別プログラムによりfile.txtは末尾に文章が追加され続けている ・本プログラムは半永久的に動き続ける #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<errno.h> #include<signal.h> #include<sys/types.h> int main () { int i = 0, j = 0, len; FILE *fp, *fp2; char buf[1024] = ""; char str[1024] = ""; while (1) { //ループ2周目以降なら一度クローズして開き直す if (i >= 1) { fclose (fp2); } if ((fp2 = fopen ("out.txt", "a")) == NULL) { printf ("out.txt:open error\n"); exit (-1); } //上と同じく if (i >= 1) { fclose (fp); } if ((fp = fopen ("file.txt", "r")) == NULL) { printf ("file.txt:open error\n"); exit (-1); } //既にout.txtに移した部分が重複しないようにfgetsで調整 if (i >= 1) { for (j = 0; j <= i; j++) { fgets (str, 1024, fp); } } //file.txtからout.txtに内容を移す while (1) { i++; if ((fgets (str, 1024, fp)) == NULL) break; if ((len = strlen (str)) >= 2) { str[len - 1] = '\0'; } else { break; } if (len <= 50) break; fprintf (fp2, "%s\n", str); } } return 0; } プログラムの内容は、 更新され続けるテキストファイル(file.txt)から、別のテキストファイル(out.txt)に出力するというプログラムです。(元となるfile.txtの内容を若干変えつつ、out.txtに出力することが本来の目的ですが、その部分は省略させて頂きました。) fopenで開くと、「その時点まで」のfile.txtしか開かれません。従って更新され続けているfile.txtの内容をコンスタントに読み取る為に、while文でfopenし続ける方法を取りました。しかし、out.txtを確認すると何故か一定の行からそれ以降が追記されないままでした。恐らく一度目のfopenにより開いたfile.txtの内容のみを抽出して、2度目以降のfopenによる読み取りが意味を為していないのではないかと推測しますが・・、どうなんでしょう。あまり自信はないです。 これを解決して半永久的に出力を続けるにはどうすればよいでしょうか。 上のプログラムや私の意図する所で何か気づかれた点や、おかしいと思われた点等ありましたら是非ご教授頂きたく思います。 どんな些細なことでも構いませんので、教えて頂けないでしょうか。 環境はCentosです。どうぞよろしくお願いします。

  • C言語の使い方を教えてください。-C言語入門者

    C言語のプログラムの処理の対象となるファイルはどこに保存したらよいのでしょうか?たとえば下記のプログラムで #include <stdio.h> #include <stdlib.h> #include <string.h> void main(void) { char *line[100], *buf; int i = 0, len, lines; FILE *fp; fp = fopen("textfile.txt", "r"); buf = calloc(128, sizeof(char)); while (i < 100 && fgets(buf, 128, fp) != NULL) { len = strlen(buf); line[i] = calloc(len + 1, sizeof(char)); strcpy(line[i], buf); i++; } fclose(fp); lines = ((i <= 100) ? i :100); free(buf); for(i = 0; i < lines; i++) printf("%s", line[i]); for(i = 0; i < lines; i++) free(line[i]); } で [textfile.txt]という名のファイルをマイドキュメントやコンパイラーを保存しているのと同じ領域に保存してコンパイラーを実行しても所要の結果が得られません。テキストにはプログラムの作り方しか書いてありません。

  • C言語の質問です。クイズをテキストファイルに書き、それを読み込むという

    C言語の質問です。クイズをテキストファイルに書き、それを読み込むというモノなのですが、その前に前回のスコアを読み込み、棒グラフにして出力しなければいけません。また、問題も1行ずつ読み込み正否を判定します。問題のテキストは、「1,問題文 1.○○ 2,○○ 3.○○」とし、頭に解答を書いています。最後に、正解した数をスコアファイルに書き、終了とします。一応、初めてなら、スコアファイルを新規作成し、2回目ならスコアファイルを開く、というところまでは、出来ましたが、その後がどうにも進みません・・。どなたか教えて頂けないでしょうか・・。 #include <stdio.h> int main(void) { FILE *fp; char str[256]; if((fp = fopen("score.txt","r")) == NULL){  printf("このゲームを初めて実行しますね。\nスコアファイルを新規作成します。\n");  fp = fopen("score.txt","w");  fclose(fp);} else{  printf("スコアファイルを読み込みます。\n");  fp = fopen("score.txt","r");  fclose(fp);} return 0; } 一応ここまでは、出来ています。

  • 【c言語】テキストファイルからバイト数を算出したい

    やりたいこと 自然言語処理について勉強しています。 Wikipediaのdumpデータから本文を抜き出して処理をしようと思ってます。 xmlの処理について試しているのですが、 欲しい出力は,,<title>~~</title>のシークポイント(pb[0])と〜〜部分のバイト数(pb[1])の記入されたファイルです. シークポイントとバイト数さえわかれば後述の2つ目のプログラムを使って 後述の実行結果のpb[0]部分が0と表示されていて困ってます. プログラミング構成 jawiki-20211220-pages-articles-multistream2.xml(読み込み先のテキストファイル) Wiki_getter1_Byte.c(バイト数を算出するプログラム,<Page>〜〜</page>間は取得できている.) Wikigetter2_text.c(getter1の出力ファイル(get_text_Byte.txt系列)からシークポイントまでfseekしてバイト数分freadしてテキストファイルに記入上と同じくページ全体とテキスト部分が取得できている.) 以下にソースコードを貼り付けます。 ======== やりたいこと 自然言語処理について勉強しています。 Wikipediaのdumpデータから本文を抜き出して処理をしようと思ってます。 xmlの処理について試しているのですが、 欲しい出力は,,<title>~~</title>のシークポイント(pb[0])と〜〜部分のバイト数(pb[1])の記入されたファイルです. シークポイントとバイト数さえわかれば後述の2つ目のプログラムを使って 後述の実行結果のpb[0]部分が0と表示されていて困ってます. プログラミング構成 jawiki-20211220-pages-articles-multistream2.xml(読み込み先のテキストファイル) Wiki_getter1_Byte.c(バイト数を算出するプログラム,,欲しいのは<text>~~</text>,<title>~~</title>,<id>~~</id>間のバイト.) Wikigetter2_text.c(getter1の出力ファイル(get_text_Byte.txt系列)からシークポイントまでfseekしてバイト数分freadしてテキストファイルに記入上と同じくページ全体とテキスト部分が取得できるプログラム.) 以下にソースコードを貼り付けます。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define SIZE 256 * 1024 * 1024 int main() { size_t p, pb[2]; char *line = malloc(SIZE); FILE *fp = fopen("jawiki-20211220-pages-articles-multistream2.xml", "r"); FILE *fw = fopen("get_text_byte.txt", "w"); if ((NULL == fp) || (NULL == fw)) abort(); while (p = ftell(fp), fgets(line, SIZE, fp)) { if (strstr(line, "<page>")) { pb[0] = p; if (strstr(line, "</page>")) { pb[1] = pーpb[0]; } printf("%zu\t%zu\n", pb[0], pb[1]); } printf("process ok"); free(line); fclose(fw); fclose(fp); } ======== 読み取ったシークポイントとバイトからxmlを抽出するプログラムは既にできているのでこの出力が正しくできるようになりたいです. *よく言われますが外部ライブラリは利用しない方向でお願いします. 追記に出力の一例を記載しておきます. 補足 出力一例です.pb[1]が取得できてないようです. 1536318555 0 1536318555 0 1536318555 0 1536318555 0 1536318555 0 1536318555 0 1536318555 0 1536318555 0 1536318555 0 1536318555 0 1536318555 0 1536318555 0 1536318555 0 1536318555 0 1536318555 0 1536318555 0 process ok%

  • C言語でセグメンテーションエラーの原因がわからず困っています。

    こんにちは。いつもお世話になっております。 C言語なのですが、何故かプログラムを実行するとセグメンテーション違反が表示されてしまい全く動きません。皆さんのお力を貸して頂けないでしょうか。 以下が問題のプログラムです。 前提条件: ・別プログラムによりfile.txtは末尾に文章が追加され続けている ・本プログラムは永劫的に動き続ける #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<errno.h> #include<signal.h> #include<sys/types.h> int main () { int i = 1, a; FILE *fp, *fp2; char *tok; //NULLを入れて初期化 char buf[1024] = ""; char str[1024] = ""; char str2[1024] = ""; //出力するファイルを開く if ((fp2 = fopen ("out.txt", "a")) == NULL) { printf ("out.txt:open error\n"); exit (-1); } while (1) { //何度もfopenするのでループ二週目以降は一旦fpを閉じる if (str2 != NULL) { fclose (fp); } //一度読み込み、2週目以降もさらに読み込み続ける if ((fp = fopen ("file.txt", "r")) == NULL) { printf ("file.txt:open error\n"); exit (-1); } //str2はループ2週目以降で使われる if (str2 != NULL) { while (1) //新しい行を見つけ出す { fgets (str, 1024, fp); if (strstr (str, str2) != NULL) { printf ("前回の最終行です:%s\n", str); break; } } } else { printf ("str2はNULLです:%s\n", str2); } //fopenで読み込んだ現段階のテキストファイルをout.txtに移す while (1) { if( (fgets (str, 1024, fp) ) == NULL)break; if ((a = strlen (str)) >= 2) { str[a - 1] = '\0'; } else { printf ("抽出した文字列が1文字以下です:%s\n", str); break; } if (strlen (str) >= 17) { strcpy (str2, str); } else { printf ("抽出した文字列が16文字以下です:%s\n", str); break; } printf ("%s\n", buf); fprintf (fp2, "%s\n", buf); strcpy (buf, ""); strcpy (str2, str); } printf ("これが検索語です:%s\n", str2); } fclose (fp2); return 0; } プログラムの内容は、 更新され続けるテキストファイル(file.txt)から、別のテキストファイル(out.txt)に出力するというプログラムです。(file.txtの内容を若干変えつつ、out.txtに出力することが本来の目的ですが、その部分は省略させて頂きました。) fopenで開くと、「その時点まで」のfile.txtしか開かれません。更新され続けているfile.txtの内容をコンスタントに読み取る為に、while文でfopenし続ける方法を取っていますが、そうするとout.txtに移し終わった行まで読み込んでしまい重複した文章をout.txtに移すことになりますので、strstrを使い、「前回fopenで開いたfile.txt」の最終行を検索してその位置からまたout.txtに移す、という方法を取りました。しかし、結果は何故かセグメンテーション違反でした。 以上のプログラムや私の意図する所で何か気づかれた点や、おかしいと思われた点等ありましたら是非ご教授頂きたく思います。 どんな些細なことでも構いませんので、教えて頂けないでしょうか。 環境はCentosです。どうぞよろしくお願いします。

  • バイナリファイルをテキストファイルに変換する方法を教えて頂けませんか。

    こんにちは。 バイナリファイルをテキストファイルのように読み込んだり、書き込んだりすることは可能でしょうか。バイナリファイルをテキストファイルとして扱う良い方法があれば是非ご教授頂きたいです。 以下は自分なりに考えたプログラムなのですが、すごく文字化けして出力されてしまいます。どこがいけないんでしょうか。 ####プログラム#### #include<stdio.h> int main(){ FILE *fp,*fp2; char str[1024]; //file.txtはバイナリファイルなのでバイナリモードで開く if((fp = fopen("file.txt","rb")) == NULL){ printf("file.txt:open error"); exit(-1); } //out.txtはテキストファイルとして保存したいのでテキストモードで開く if((fp2 = fopen("out.txt","at")) == NULL){ printf("out.txt:open error"); exit(-1); } //一行ずつバイナリファイルをテキストファイルにして保存 while((fgets(str,1024,fp)) != NULL){ printf("%s\n",str); fprintf(fp2,"%s\n",str); } fclose(fp); fclose(fp2); return 0; } ####ここまで#### 以下が出力されたテキストファイル(out.txt)です。 ^A^Dc ^A^D^L<87> ^Y<98>X^?m?;^D&ordm;?^QI&egrave;&Ccedil; ^A^Dc ^A^D^L<87> ^Y<98>X^?m?;^D&ordm;?^QI0g 酷い文字化けを起こしてしまっています。 解決方法をご存知であれば教えて頂けないでしょうか。どうぞよろしくお願いします。

  • C言語のfopenについて教えてください。

    C言語のfopenについて教えてください。 ある1つのファイルをr(テキストファイル読み込みモード)でfopenしたとします。 そのファイルをfcloseする前に、同じファイルが再度rモードでfopenされても問題ないのでしょうか? 何を気にしているかと言いますと、あるプログラムであるファイルをrモードでfopenして読み込む処理があるのですが、そのプログラムを呼び出す処理が複数あります。 確率は低いと言えど、もし同時にその処理が実行された場合、rモードでfopenしているファイルにfclose前に再度rモードのfopenがされたらエラーとなってしまうのでしょうか? もし、エラーとなる場合、回避する方法がありますか? また、エラーとならない場合は、fcloseするまで次の処理が待ってしまうのでしょうか? 読み込みモードだから問題ないのかなとも思ったのですが、どなたかご存知だったら教えてください。 よろしくお願いしますm(_ _)m

専門家に質問してみよう