• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ファイルの入出力で困っています(C言語))

C言語のファイル入出力で困っています

このQ&Aのポイント
  • C言語のファイル入出力に関して困っています。プログラムがコンパイルはできるものの、実行がされない状態です。具体的なプログラムの内容や問題点を説明しました。
  • プログラムでは、sprintfを使ってファイルを作成し、fprintfで読み込み、countを用いて繰り返し別のファイルを読み込み・作成しています。しかし、何度見直してもエラーの原因がわからず、困っています。
  • プログラムの実行結果を見る限りでは、fscanfの部分に問題があるようです。具体的なエラーメッセージや想定しているファイルの形式についても説明しました。ご助力をお願いします。

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

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

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などのスクリプト言語でプログラムを書くと思いますが。

nathan3
質問者

お礼

>glibcやBSD系のlibcが使えるならsprintfではなくasprintfを使うかでしょうね。 プログラムはさまざまな書き方があって面白い反面難しいです。 hanabutakoさんから提案いただいたものは正直まだよくわかっていませんが、いずれ使えるよう精進したいと思います。 詳細にご説明いただき、ありがとうございました。

その他の回答 (2)

  • maiko0318
  • ベストアンサー率21% (1483/6969)
回答No.3

とりあえず、 char fname1[20]; char fname2[20]; にしましょう。 char *fname1; char *fname2; ですと、ポインターが作られるだけで文字列の格納エリアは作られません。

nathan3
質問者

お礼

無事、実行できました。 ありがとうございます。 ポインタの使い方がいまいち理解できていませんでした。 再度、ポインタの使い方を確認し勉強しなおしたいと思います。

  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.1

本当にコンパイルエラー出ないのかな? 出ると思うんだけど。 ワーニングでも潰す必要あり、ですよ。 また実行出来たとしたらエラーメッセージが出ると思うのですが、 エラーメッセージを無視して先には進めません。 質問する場合、これらは全てアップしないと回答も付きにくいでしょう。 さてコードですが突っ込みどころが多過ぎます。 取り敢えず1点、fopenが成功する前にsprintfの実行は不可能でしょう。

nathan3
質問者

お礼

ご指摘ありがとうございます。 おっしゃるように、質問が漠然としておりました。 >取り敢えず1点、fopenが成功する前にsprintfの実行は不可能でしょう。 sprintfは指定した形式の文字列として格納するという認識で、独立して実行はできると思っていたのですが、fopenしないとsprintfが実行できないというのは書き方の問題でしょうか。

関連するQ&A

専門家に質問してみよう