• ベストアンサー

テキストファイルから読み込ませたい

このプログラムをテキストファイルから読み込ませたいのですが、 どう改良したらいいかわかりません。どなたかプログラムの追加を教えていたたけないでしょうか。 #include <stdio.h> int main() { int i,key,len,num ; char str[256],*ptr[128] ; num = 0 ; len = 0 ; ptr[0] = str ; do { key = getchar(); str[len] = (char)key ; if ( key == ' ' || key == '.' || key == ',' || key == '!' || key == '?' || key == '"' || key == 0x0a || key == 0x0d ){ str[len] = '\0' ; if ( str+len-ptr[num] ){ num ++ ; } ptr[num] = str+len+1 ; if( key=='.' || key== '!' || key=='?' || key=='"'){ str[++len]=(char)key; str[++len]='\0'; ptr[++num]=&str[len+1]; } } len ++ ; } while ( key != 0x0a && key != 0x0d && len < 255 ); str[255] = '\0' ; for (i=0 ;i<num ;i++){ printf("%d. %s\n",i+1,ptr[i]); } return i ; }

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

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

プログラムからファイルを読み込む方法はありますが、 ただそんなことしなくても、リダイレクトを使って C:\>prog.exe < data.txt (prog.exeというのはこのファイルをコンパイルしたexeファイル、 data.txtは読み込みたいファイル) とすればできます。 これがだめならまた連絡ください。

yosudesu
質問者

補足

即レスありがとうございます。 実行した結果テキストファイルを読み込む事は成功致しました。 しかし、プログラム自体に問題があるらしく一行分だけ実行して終わってしまいます。 何行もあるテキストファイルを扱うプログラムにするにはどうすればいいのでしょうか。 お時間がありましたらまたよろしく御願いします。

その他の回答 (3)

回答No.4

ファイルを開く FILE *fp; if ((fp=fopen("test.txt","r"))==NULL) { return -1; } 1文字読む key = getchar(); を key = fgetc(fp); に変更 ファイルの終わりまで } while ( key != 0x0a && key != 0x0d && len < 255 ); を } while ( key != EOF && len < 255 ); に変更 ファイルを閉じる fclose(fp);

yosudesu
質問者

お礼

具体例まで出していただき、ありがとうございました。 大変参考になりました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

ファイルから読むには、 #1の様にする他 FILE *fp; fopen("filename","r"); fgetc(fp); feof(fp); fclose(fp); の様にファイル関係の関数を使います。 プログラムでは、行末コードがくるか、バッファが一杯になるまで、文字を読み込むようになっているので、1行しか処理できません。 #2で書かれているように、 ファイルの終了を調べて、繰り返し、読み込みするように改良しないといけないと思います。

yosudesu
質問者

お礼

ご回答ありがとうございました。 参考になりました。

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.2

私はまだこのプログラムを完全に理解していません。 だから不具合があるかもしれませんが、 いちおう以下の方法で何行も解析できるようになります。 (1)もうひとつdo{を付け加える。num = 0 ;の上。 do { num = 0 ; ... (2)getchar()のあとに以下を付け加える。 if(key == EOF){ str[len] = '\0' ; break; } (3)以下を付け加える。returnの前。 }while (key != EOF); なお、キーボードから入力するとき、終わらせるには Ctrlキー押しながらZを押します。そしてエンターキーを押します。 (LinuxなどだとZじゃなくてMだったかな…)

yosudesu
質問者

お礼

ご回答ありがとうございました。 参考になりました。

関連するQ&A