- ベストアンサー
C言語でファイルを表示させるプログラミングがわかりません。
- ファイルを開いて内容を表示するC言語のプログラムがわかりません。
- 複数人のデータを入力し、ファイルに記録する方法がわかりません。
- C言語でのファイル操作の基本がわかりません。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
ざっと書いてみましたので、参考にしてください。 scanf("%s,%d,%d,%d" , name , &year , &month , &day); とせずに、名前と生年月日の入力をわけたのは、 一緒にしてしまうと、 例えばtarou,2007,1,1と入力した時に、 それが全てnameに格納されてしまい、 year,month,dayにゴミが入ってしまうためです。 どうしても一緒に入力したいのであれば、 scanf("%d,%d,%d,%s" , &year , &month , &day , name); の順で入力させるか、或いは scanf("%s" , buf); として一旦全て別のバッファに格納した後、それを解読するような手法をとることになるかと思います。 例えばstrtokという関数がありますので、その利用を考えてみてください。 #include <stdio.h> #include <stdlib.h> const static int TRUE = 1; const static int FALSE = 0; const static int BUFSIZE = 1024; const static char* DATAFILE = "data.txt"; int open_file(FILE** , const char * const , const char * const); void read_data(void); void write_data(void); int main(void) { read_data(); write_data(); return 0; } /* ファイルを開く 引数 fp ファイルポインタへのポインタ fname ファイル名 mode ファイルを開く際のモード 戻り値 オープン成否 */ int open_file(FILE** fp , const char * const fname , const char * const mode) { FILE* f; f = fopen(fname , mode); if(f == NULL) { fprintf(stderr , "cannot open file %s with mode %s\n" , fname , mode); return FALSE; } *fp = f; return TRUE; } /* あれば、DATAFILEを読む 無ければ何もしない */ void read_data(void) { FILE* fp; if(! open_file(&fp , DATAFILE , "r")) { return; } char buf[BUFSIZE]; while((fgets(buf , BUFSIZE , fp)) != NULL) { printf(buf); } fclose(fp); } /* ユーザに入力を求め、ファイルへ出力 */ void write_data(void) { FILE* fp; if(! open_file(&fp , DATAFILE , "a")) { fprintf(stderr , "error in write_data.\n"); exit(EXIT_FAILURE); } while(TRUE) { char name[BUFSIZE]; int year , month , day; // 氏名の入力 printf("name (for exit, enter 'quit')> "); scanf("%s" , name); if(strncmp(name , "quit" , 4) == 0) { break; } // 生年月日の入力 printf("birthday > "); scanf("%d,%d,%d" , &year , &month , &day); fprintf(fp , "%s,%d,%d,%d\n" , name , year , month , day); } fclose(fp); }
その他の回答 (4)
ソースコードの以下の部分を見てください。 printf("name (for exit, enter 'quit')> "); scanf("%s" , name); if(strncmp(name , "quit" , 4) == 0) { break; } 氏名の入力を要求する部分ですが、 氏名としてquitを入力すると、 無限ループを脱出してプログラムが終了するようになっています。
* 1番目と2番目の警告について ソースコードがCではなく、C++として、認識されているようですね。 C++では、通常、入出力処理はprintf,scanfではなく、ストリームを用いて行いますので、 それについての警告かと思います。 VCは使わないので、推測になってしまいますが、 ファイルの拡張子が.cppになっていませんか? ファイルの拡張子を.cにしてコンパイルしなおすと良いかと思います。 * 3番目のエラーについて 冒頭に #include <string.h> を追加してみてください。 strncmp関数を宣言している標準ヘッダファイルです。 strncmp関数はquitと入力された時にプログラムを終了するために 利用しているだけなので、別の手段でプログラムを終了するならば、 削ってしまってもOKです。
お礼
冒頭に#include <string.h>をいれたら実行できたのですが、名前を生年月日を永遠に入れ続けるだけで終わらないのですがどうすればいいでしょうか?
>ご回答ありがとうございました。 >でも、エラーが出てしまうんですが、どう直せばいいのでしょうか? これは失礼を致しました。 コンパイルエラーでしょうか、それとも実行時のエラーでしょうか。 どちらにせよ、エラー時のメッセージなど提示していただければ、 回答者としての責任がありますので、修正します。
お礼
コンパイルで以下のようなものが出てしまいました。 8.cpp(32) : warning C4996: 'fopen' が古い形式として宣言されました。C:\Program Files\Microsoft Visual Studio 8\VC\include\stdio.h(234) : 'fopen' の宣言を確認してください。 8.cpp(78) : warning C4996: 'scanf' が古い形式として宣言されました。C:\Program Files\Microsoft Visual Studio 8\VC\include\stdio.h(295) : 'scanf' の宣言を確認してください。 8.cpp(79) : error C3861: 'strncmp': 識別子が見つかりませんでした ビルドログは "file://c:\Users\ユーザー\Documents\Visual Studio 2005\Projects\kadai8\Debug\BuildLog.htm" に保存されました。 - エラー 1、警告 2
- SAYKA
- ベストアンサー率34% (944/2776)
ヒントだけ それぞれの処理は 作れてるのかな? ・ファイルdata.txtに人の名前と生年月日を追記 ・ファイルをいったん閉じて開きなおし ・ファイルの内容を表示する ・連続して入力 ・各人に対してファイルに記録 (全部文中から抜粋) 最低でもこれらが単品で作動する物を作れないとアウト
お礼
ご回答ありがとうございました。 でも、エラーが出てしまうんですが、どう直せばいいのでしょうか?