- ベストアンサー
ファイル操作
今C言語のファイル操作を勉強中です。 作ったソースが問題の指示通りのことをやれているか分からないので、違うことを書いていたらご指摘お願いします。 問題は「新規に作成したファイルに、キーボードから取り込んだ5つの文字列を順次書き込むプログラムを作成せよ。更に、そのファイルからデータを文字列単位で読み出して、画面に表示させる処理を付け加えよ。」 ソースは以下です ----------------------------------------------- #include<stdio.h> void main(void) { FILE *str_ptr; char string[30]; int i; str_ptr = fopen("outfile", "w"); printf("5個の文字列入力してください。\n"); for(i=0 ; i<5 ; i++){ scanf("%s", string); fputs(string, str_ptr); } fclose(str_ptr); str_ptr = fopen("outfile", "r"); fgets(string, 30, str_ptr); printf("%s ", string); fclose(str_ptr); } ------------------------------------------------- 実行結果は、例えば「"suzuki","katou","sugiura","sasaki","kawai"」を入力したとすると suzukikatousugiurasasakikawai と全部つながってしまいます。 「ファイルからデータを文字列単位で読み出して」という言葉が何か引っかかります。 これで大丈夫なのでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
入力&出力方法を以下のように変えてみてはどうでしょう。 入力:scanf()は改行コードを取り込んでくれませんし、かなりやっかいな関数ですのでなるべく使用を避けたほうが良いです。単純な入力でしたらfgets()が良いと思います。 scanf("%s", string); → fgets(string, sizeof(string), stdin); 出力:今のfgets()+printf()では1行しか出力できないため、ファイル終端までループさせる必要があります。for文でのループ数決め打ちより柔軟性を持たせる意味も込めてwhile文でファイル終端まで回すことをお勧めします。 while( fgets(string, sizeof(string), str_ptr) != NULL ) { printf("%s", string); }
その他の回答 (3)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
5個の文字列を読み込む時にfgetsを使えば改行込みで入力されるので、 fputsのままでもいいです。 ファイルから読み出す場合には、 ファイルの終端になるまで繰り返し読み込むということが必要だと思います。
>更に、そのファイルからデータを文字列単位で読み出して これを実現するには、1つの文字列は1行である方が都合がいいですよね。 画面に表示する puts は改行してくれるのですが、fputs は改行は書き込んでくれないので、改行コード(\n)は自分で書き込む必要があります。 あとは、読み出す方も for で回してやればいいと思います。 >付け加えよ。 課題としては、目的どおりに動作する関数を作成せよって意味になるので、main関数の中に全てを作成するのは美しくないです。 文字列を入力してファイルに書き込む関数を作り、mainから呼び出す。 更にファイルから文字列を読み込んで表示する関数を作成し、mainに呼び出す部分を付け加える。
- drmoreau
- ベストアンサー率41% (33/79)
文字列を書き込むときにfputsではなくfprintfを使えば一行ごとに書き込むこともできます。 読み込むときはfscanfを使うといいのではないかと思います。 たいしたことではないのですが、変数名 str_ptr は fp あるいは file_ptr とされたほうが変数の意味がわかりやすいのではないでしょうか。