• ベストアンサー

C言語のファイル処理について

環境 OS:Windows VISTA Ultimate コンパイラ:Borland C++ Compiler 5.5 Cの基礎的な勉強をしています。2つほど質問があります。 1つ目は、ファイル処理の勉強としてプログラムを作っているのですがファイルが上手く開けません。プログラムとしてはファイルを開いて、ファイル内に記述されている数値を取り出し、計算を行う簡単なものを作っています。ソースは以下のものになります。 #define N 256 int file_read(char filename[] , int count[]) { int m; FILE *fp; fp=fopen(filename,"r"); if(fp==NULL) { /* オープン失敗 */ printf("Not Found File\n"); return -1; /* 戻り値-1 */ } while((m = fgetc(fp)) != EOF) { 読み取った数値配列に格納する処理 } fclose(fp); return 0; } int operation(int count[]) { 計算処理 return 0; } int main(void) { int *count[N]; char *filename[256]; memset(count, 0, sizeof(count)); /* 変数・配列初期化 */ printf("Please Input Filename:"); fgets(filename, sizeof(filename), stdin ); if(file_read(filename,count) != -1) operation(count); return 0; }  バッファオーバーランの事を考え、fgetsによるキー入力にしたのですがファイルオープン失敗になってしまいます。fgetsのあと、変数filenameの中身を確認したところ、キー入力した文字はきちんと代入されていました。オープンするファイルはきちんとあるのですが・・。  fgetsをscanfに変えた場合は上手くいくので書式指定をしてscanfを使えばいいのでしょうが、なぜfgetsで上手くいかないでしょうか? 2つ目はgetchar()とfgets()に関してです。 while((c = getchar()) != EOF) { . .処理 . fgets(変数, sizeof(変数), stdin ); . .処理 . } とした場合、fgetsの処理が無視されてしまいます。 これはどういったことが原因なのでしょうか。 ご教授、お願いいたします。

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

  • ベストアンサー
回答No.3

No.1です >オープンするファイルはtemp.datで、単純に文字配列の中身を\0がくるまで表示して確認しました。 これの「表示」を「printf("%s", filename)」として確認しているのであれば間違いです。 最低限、こう記述して確認します。 ----------------- for( i = 0; i < N < i++ )   printf( "%02x ", &filename[i] ); ----------------- プログラム上は、文字であろうと数値であろうとすべて「データ」でしかありません。 そして、そのデータには「文字として表示できない内容」も含まれます。 No.2氏が回答されていますが、Enterキーの文字コードは「文字として」表示されません。 その為に、ファイル名として違うという「プログラムとしては正しい」動作を行っています。 >2つ目は標準入力の関係なんでしょうか・・? 標準入力は関係ありません。使用している入力関数の違いです。 >getcharで復改が残ったため、fgetsでそれを読み取ってしまい、処理を通り越してしまった・・ということなんでしょうか? はい。

net0401
質問者

お礼

お礼が遅れてしまい申し訳ありません。おかげさまでプログラムも無事に動作いたしました。 なるほど、確認は%xの書式指定ですべての要素に対して行わないと、きちんとできていないのですね。 参考書には載っていないので大変勉強になりました。 ご教授、ありがとうございます。

その他の回答 (2)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

プログラムでは test.txt と test.txt\n は違うものとして認識されます fgetsでは改行コードも読み込まれるので改行を取り除く処理が必要です

net0401
質問者

お礼

お礼が遅れてしまい申し訳ありません。おかげさまでプログラムも無事に動作いたしました。 fgetsでは\nまで読み取るのですね。選んだ参考書が悪かったのか、こうしたことが書いていなかったので、大変勉強になりました。\0まで読み取るように変えたところ、うまく動くようになりました。ありがとうございます。

回答No.1

一つ目 >char *filename[256]; これ、「char型のポインタ」を256個確保しているだけで、実体がないから、正常動作しないけど? 仮に壊れても問題のないメモリ領域を使用していた場合、「filename[]のどこまで」を確認してますか? 一つ目と二つ目の共通の問題。 ヒント「Entreキーの扱い」

net0401
質問者

補足

すいません。書き間違えです。filename[256];です。 これでfopenをしたときにNULLとなっています。 オープンするファイルはtemp.datで、単純に文字配列の中身を\0がくるまで表示して確認しました。 2つ目は標準入力の関係なんでしょうか・・? getcharで復改が残ったため、fgetsでそれを読み取ってしまい、処理を通り越してしまった・・ということなんでしょうか?

関連するQ&A

専門家に質問してみよう