- ベストアンサー
C言語のファイル入出力で困っています
- C言語のファイル入出力に関して困っています。プログラムがコンパイルはできるものの、実行がされない状態です。具体的なプログラムの内容や問題点を説明しました。
- プログラムでは、sprintfを使ってファイルを作成し、fprintfで読み込み、countを用いて繰り返し別のファイルを読み込み・作成しています。しかし、何度見直してもエラーの原因がわからず、困っています。
- プログラムの実行結果を見る限りでは、fscanfの部分に問題があるようです。具体的なエラーメッセージや想定しているファイルの形式についても説明しました。ご助力をお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
char *fname1; ... sprintf(fname1, "sankasha%d.txt", count); fname1はポインターであって、配列ではないですよね。 そこにsprintfしてもアクセス違反などで強制終了でしょう。 char fname1[100]; のように配列をちゃんと確保するか、 glibcやBSD系のlibcが使えるならsprintfではなくasprintfを使うかでしょうね。 asprintf(&fname1, "sankasha%d.txt", count); fp = fopen(fname1, "r"); if (fp == NULL){ printf("%s can't open a file\n", fname1); return -1; } free(fname1); あと、バッファが溢れないという自信がよほど無い限りはsprintfは使わないですね。 ISO C99で標準化されたsnprintfを使うのが普通だと思います。 まあ、何かのデータの整理をするプログラムはよほど速度が問題にならない限り、自分だったらPython、Perl、Rubyなどのスクリプト言語でプログラムを書くと思いますが。
その他の回答 (2)
- maiko0318
- ベストアンサー率21% (1483/6969)
とりあえず、 char fname1[20]; char fname2[20]; にしましょう。 char *fname1; char *fname2; ですと、ポインターが作られるだけで文字列の格納エリアは作られません。
お礼
無事、実行できました。 ありがとうございます。 ポインタの使い方がいまいち理解できていませんでした。 再度、ポインタの使い方を確認し勉強しなおしたいと思います。
- Tasuke22
- ベストアンサー率33% (1799/5383)
本当にコンパイルエラー出ないのかな? 出ると思うんだけど。 ワーニングでも潰す必要あり、ですよ。 また実行出来たとしたらエラーメッセージが出ると思うのですが、 エラーメッセージを無視して先には進めません。 質問する場合、これらは全てアップしないと回答も付きにくいでしょう。 さてコードですが突っ込みどころが多過ぎます。 取り敢えず1点、fopenが成功する前にsprintfの実行は不可能でしょう。
お礼
ご指摘ありがとうございます。 おっしゃるように、質問が漠然としておりました。 >取り敢えず1点、fopenが成功する前にsprintfの実行は不可能でしょう。 sprintfは指定した形式の文字列として格納するという認識で、独立して実行はできると思っていたのですが、fopenしないとsprintfが実行できないというのは書き方の問題でしょうか。
お礼
>glibcやBSD系のlibcが使えるならsprintfではなくasprintfを使うかでしょうね。 プログラムはさまざまな書き方があって面白い反面難しいです。 hanabutakoさんから提案いただいたものは正直まだよくわかっていませんが、いずれ使えるよう精進したいと思います。 詳細にご説明いただき、ありがとうございました。