• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:構造体でのファイル操作)

構造体でのファイル操作においてDebug assertion failedが表示される理由は?

このQ&Aのポイント
  • 構造体でのファイル操作においてDebug assertion failedが表示される理由を説明します。
  • ファイル操作時に発生するエラーの一つであるDebug assertion failedについて解説します。
  • ファイルの読み込みやデータの書き込み時に発生するエラーの一つであるDebug assertion failedの原因と対処法について説明します。

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

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.3

既に回答付いていますが… int a; scanf("%d",a); という書き方が問題ない…と思いますか? この時scanf()に渡されるのは、変数aの値(未初期化なので不定な値)で、scanf()はその不定な値をint型の値を格納するアドレスとして使います。 # "%d"で指定されていますからね。 さて、あなたのコードはどうでしょう? あとは…「半角スペース区切り」なのか「カンマ区切り」なのかも注意が必要でしょうけど。

saya19
質問者

お礼

半角スペースにしたらなおりました ありがとうございます

saya19
質問者

補足

while (fscanf(fp, "%d %d %d",&a.no[i],&a.A[i],&a.B[i] ) != EOF) にしたら エラーがとまりました でもすべてに0が入ってしまいました どうしてでしょうか?

その他の回答 (4)

回答No.5

マルチポストは禁止されてますよ!!! そのエラーが表示されるのは、プログラムに不具合があるからです。 ほとんど同じですが、こう書けば動きます。 int i=0; FILE *fp; fp = fopen("Data.txt","r"); while (fscanf(fp, "%d %d %d", &a.no[i], &a.A[i], &a.B[i] ) != EOF){ i++; } fclose(fp); 一応、その後にこういうコードを書いてちゃんと読めたか表示させて調べられます。 int j; for (j = 0; j < i; j++) printf("%d %d %d\n", a.no[j], a.A[j], a.B[j]); 違いは、fscanfの第2引数で","でなく、" "を区切りとして使っていること、 第3 - 5引数の頭にアドレス演算子がついていることです。 ファイル内の数値の区切りに" "を使っているので、同じものを区切りとして指定しなくてはいけません。また、scanfやfscanfで値を取る場合は、アドレスを渡します。なぜ、アドレスで渡さないといけないかというと、その関数の呼び出し元の変数の値を変更する必要があるからです。 C言語には値渡ししかありませんが、それだとscanfにようにデータを読み込んで呼び出し元の変数を変更するということができないので、そういう場合はアドレス渡しを使います。値渡しだと、その値をいくら変更しても元の環境での変数の値は変わりませんが、アドレスが渡ると、そのアドレスに対して書き込むことで、呼び出し元の変数を変更することが可能です。 ざっくり言うとこういう感じですが、詳しくはポインターについて勉強してみてください。ポインターはC言語でまともなプログラムを作るには必須の仕組みです。 更に余談ですが、普通、こういうことをする場合は構造体の配列にしませんか? #define MAX_SCORES 50 struct score { int student_id; int test_A; int test_B; } scores[MAX_SCORES]; もちろん、fscanfをするときには&a[i].noとなりますが。 Unix系のOSを使っていると、man operatorというコマンドを打つと、演算子の順序についての説明が見られます。例えば、1 + 1 * 2だと 1*2 から先に計算しますよね?&a[i].noではa[i]から先に評価します。 あと、while文の条件はfscanf... != EOFだけでなく、i < MAX_SCORESもですよね? 自分だったら、ここはfor文で書きますね。 for (i = 0; i < MAX_SCORES && !feof(fp); i++) { ...brahbrah... } のような感じで。 さらに余談ですが、Brian Kernighan, Rob Pike著「プログラミング作法」ではenumの方がよさそうに書いてあるんですが、DWARFにデバッグ情報が出ない気がするので個人的にはdefineで定数値を書くほうが好きです。 とまぁ、色々と書きましたが、今日はfscanfの第3引数以降の引数がアドレスをとることを覚えて帰ってください。あと、マルチポストはイカンよ。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.4

マルチポスト好きですね。 http://okwave.jp/qa/q7616516.html いくつも質問しても答える人は同じなので印象が悪くなるだけですよ。 #3の問いに答えてもらった方が良いでしょう。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

せっかくの構造体なので構造体配列を使ってはどうでしょう? あと構造体の定義を見たいですね。 C言語なんでも質問掲示板にマルチポストしていると思いますが本日は掲示板はメンテ中です。 http://dixq.net/forum/viewtopic.php?f=3&t=11179 メンテが終わったらフォローしておいて下さい。

saya19
質問者

補足

struct seiseki { int no[50]; int A[50]; int B[50]; }a; 構造体の定義はこうなっています

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.1

>どうしてでしょうか? 構造体をどう定義してるのかわかりませんが、おそらくはfscanfの仕様を理解していないから(使い方を間違ってるから)

関連するQ&A