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

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

構造体でのファイル操作

1 2 3 1 2 3 1 2 3 1 2 3 みたいに書き込まれた txtデータを構造体でよみこみたいのですけどうまくいきません プログラムはこんなかんじです 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); a.noが1列目で a.Aが2列目で a.Bが3列目です Debug assertion failed  と表示されます どうしてでしょうか?

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

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答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% (1619/5654)
回答No.1

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

関連するQ&A

  • ファイル入出力について教えて下さい。

    ご覧いただきありがとうございます。 数値を入力して、数値を出力する方法を教えて頂きたいです。 ・   ・   ・ fp = fopen( "a.txt", "a" ); for( i = 16383; i >= 0; i-- ) { fprintf( fp, "%d", i ); } fclose( fp ); ・   ・   ・ data = (int *)malloc(32768); fp = fopen( "a.txt", "r" ); for( i = 0, i <= 16383; i++ ) { fscanf( fp, "%d", data+i ); } fclose( fp ); ・   ・ ・ 以上の記述で、入力はうまくいくのですが、出力の際に数値でなくなってしまいます。どうしてでしょうか? ご存じの方がおりましたら、ご回答よろしくお願いいたします。

  • ファイルの入力、出力

    #include<stdio.h> int main(){ int a,b; FILE *fp0, *fp1;   fp0 = fopen("test1.dat", "r"); if( fp0 == NULL ){ printf("Cannot open test1.dat"); exit(1); } fp1 = fopen("file.txt", "w"); while((fscanf(fp0, "%d %d", &a,&b)) != EOF){ fprintf(fp1, "%d %d\n", a*a,b*b); } fclose(fp0); fclose(fp1); return(0); } test1.datファイルを読み込んで、変数a,bに値をいれ、 その二乗結果をfile.txtに書き込むプログラムなのですが test1.datファイルに書き込まれてる値をどのようにa,bに代入されているのかわかりません。 例えば test1.datが 1 2 3 4 5 であると、 file.txtには 1 4 9 16 25 16 と書き込まれています。 test1.datが 1 1 2 2 3 3 であると file.txtには 1 1 4 4 9 9 となっています。 どのように、変数に値が入るのでしょうか??

  • ファイルからの読み込み

    fscanfを使ってファイルの中身を読み込みたいのですが、ファイルの中身の長さが統一されていない場合どうしたらよいでしょうか? 読み込むファイルの中身 A d 1 B 3 2 G 5 1 2 B 6 G H 5 2 5 今まではファイルの中身の各行の文字数が全部3つだったので fp=fopen(A.txt,"r"); while(fscanf(fp,"%s %s %s",data,data+1,data+2)!=EOF) { printf("%s?n",data); }としていました。わかりにくい文章ですいません。

  • ファイル操作

    あるファイルから長さの違った数字や文字を読み込んで配列に格納したいのですが数字などの長さが違うとなんかおかしくなってしまいます; 例えば 1 a 1 2 a 2 3 b 3 4 b 4 などのファイルはできるのですが 0 1 2 3 a 3 4 b 4 5 c 5 の場合5つの配列に格納したいのです。1行目で1つ2行目で1つ3行目の 左、真ん中、右の数字でそれぞれ1つづつ格納したいのです。 それで自分でやったのですが typedef struct path{ int left [100]; int right[100]; char center [100]; }Path; int main(int argc,char *argv[]) { FILE *fp; Path path; int i=0; int first; int second[100]; fp = fopen(argv[1],"r"); while(fscanf(fp,"%d %c %d",&path.left[i],&path.center[i],&path.right[i])==3){ i++; } fclose(fp); このようにやると3行目からはきちんとよみこむのですが1、2行目がうまくできません@@; firstとsecondのそれぞれ1、2行目を入れたいのです。 fscanfをもう1つ増やすしてもやってみましたがうまくいきませんでした。 ちなみにfscanf関数のところをならったばかりです。 fgetcとかそのようなのを使うのでしょうか?(よくわからないですけど) よろしくお願いします。ちなみにLinuxでgcc、C言語です。

  • テキストファイルの出力について

    今、学校の課題でC言語を使ってプログラムを作っています。 20000個のデータを読み込んで、200個ずつに区切り、別々のテキストファイルで出力するというものです。 最初につくったのは、以下の通りです。 *********************************************** FILE *fp; { int b,i=0; data[0][i]=trend_data[0][i]; data[1][i]=trend_data[1][i]; fp = fopen("D1.txt","w"); for(i=0;i<=199;i++){ fprintf(fp,"%8.8f %8.8f\n",data[0][i],data[1][i]); } fclose(fp); fp = fopen("D2.txt","w"); for(i=200;i<=399;i++){ fprintf(fp,"%8.8f %8.8f\n",data[0][i],data[1][i]); } fclose(fp); ・・・ ***************************************** これだと20000まで繰り返し記述しなければならずかなり困難だと思いました。そこで、ループを作ろうとしたのですが、テキストファイルをループを使って複数作成する方法がわかりません。 以下のようなプログラムを作ったのですが、テキストファイルが一つしか作られませんでした。 どのように記述すればよいのでしょうか? **************************************** FILE *fp; { int a,i=0; int b=1; int c=199; data[0][i]=trend_data[0][i]; data[1][i]=trend_data[1][i]; start: fp = fopen("D[1+b].txt","w"); for(i=a;i<=c;i++){ fprintf(fp,"%8.8f %8.8f\n",data[0][i],data[1][i]); if(i > c) c = c+200; a = a+200; b++; goto start; fprintf(fp,"%8.8f %8.8f\n",data[0][i],data[1][i]); fclose(fp); } } ****************************************** よろしくお願い致します。

  • xcodeでのファイル操作について

    xcodeでのファイル操作について いろいろ自分で調べてみたのですが、 xcodeでファイル操作が上手く出来ません。 例えば、 #include <stdio.h> int main () { int x; FILE *fp; fp = fopen("input.txt", "r"); fscanf(fp,"%d", &x); printf("%d",x); fclose(fp); return 0; } というプログラムを書いても、input.txtの内容によらず「0」と出力されます。 つまりinput.txtが開けていないということだと思うのですが、 どうすればちゃんと開けるようになるのでしょうか? 教えて下さい! xcodeのバージョンは3.2.2です。 出来れば、ソースの方ではなく、xcodeの設定をいじってなんとかする方が良いです。

    • ベストアンサー
    • Mac
  • C言語のファイル操作についての質問です

    #include <stdio.h> #include<process.h> int main(void) { FILE *fp; int a[200], i, j, cnt, max, max_i; fp = fopen("data.txt", "r"); if (fp == NULL) { printf("file cannot open.\n"); exit(1); } for(i = 0; i < 200 && fscanf(fp, "%d", &a[i]) == 1; ++ i) ; fclose(fp); for(max = max_i = j = 0; j < i; ++ j){ int k; for(cnt = 0, k = j + 1; k < i; ++ k) cnt += (a[j] == a[k]); if(cnt > max) max = cnt; max_i = j; } printf("%d\n", a[max_i]); return 0; } これは「data.txt」というファイルから最頻値を探し出し、その値を表示するプログラムです。 しかし、このプログラムだと最頻値が1つしか表示できないので、 最頻値が複数ある場合でも、すべての最頻値の値を表示させるようなプログラムに書き換えてほしいです。 よろしくお願いします。 例)data.txt 30000 100 150 30000 30000 100 4320 100 出力↓ 30000 100

  • fscanf()

    fcanf()がうまくいきません。 画面には、42640888のような数値が表示されます。 どこが間違ってるか教えてください。 (test.txtに23と書いてあるとします。) #include<stdio.h> int main(void) {    FILE *fp;    FILE *fp1;    char str[10];    int a;    fp=fopen("test.txt","r")    fp1=fopen("a.txt","w")    while(!feof(fp)){       fgets(str,8,fp);       fputs(str,fp1);    }    fscanf(fp,"%d",&a);    printf("%d",a);   fclose(fp);   fclose(fp1);   return 0; }

  • ファイルの入出力

    学生です。まだ習い始めて間もないのですがよろしくお願いします。 27.000000,207.000000,116.000000 48.000000,90.000000,116.000000 48.000000,90.000000,116.000000       : テキストの中にある上記のカンマ区切りのデータをfscanfで読み込んで違うテキストに同じ数値を出力したいのですがうまく出力できません。 0.000000,0.000000,+NAN 0.000000,0.000000,+NAN 0.000000,0.000000,+NAN      : 数値は上記のように出力されてしまいます。 プログラムは以下の通りです。 main() { FILE *fp; double m[30][3]; int i,j; double e1,e2,e3; fp=fopen("data00.txt","r"); for(i=0;i<30;i++){  fscanf(fp,"%f,%f,%f\n",&e1,&e2,&e3);  m[i][0]=e1;  m[i][1]=e2;  m[i][2]=e3; } fclose(fp); fp=fopen("data01.txt","w"); for(j=0;j<30;j++){  fprintf(fp,"%f,%f,%f\n",m[j][0],m[j][1],m[j][2]); } fclose(fp); getch(); exit(0); } データの読み込みがうまくいってないのだと思いますがわかりません。 間違いがあったならご指摘お願いします。

  • 構造体の文字列データをファイルへ書き込む方法は?

    構造体の文字列データをファイルへ書き込む方法として、構造体のデータを一気に書き込まずに、データ毎に書き込むことを勉強としてやってみようとしました。 数字の場合はうまくいったのですが、文字列の場合が分かりません。 ご存知の方、よろしくお願いいたします。 <数字の場合> typedef struct { int m1, m2; } Data; fwrite(&data[i].m1, sizeof(int), 1, fp); fwrite(&data[i].m2, sizeof(int), 1, fp); <文字列の場合> #include <stdio.h> typedef struct { char m1[10], m2[10]; } Data; int main() { static Data data[3] = { { "a1", "b1"}, { "c1", "d1"}, { "e1", "f1"}, }; Data data2[10]; FILE *fp; int i, n; fp = fopen("file.dat", "wb"); if (fp == NULL) return 1; for (i = 0; i < 3; i++) { fwrite(&data[i].m1, sizeof(Data.m1[10]), 1, fp); ← sizeofでエラーが出る fwrite(&data[i].m2, sizeof(Data.m2[10]), 1, fp); } fclose(fp); 以下省略

専門家に質問してみよう