- ベストアンサー
fscanfの使い方
現在C言語の勉強をしているのですが、ファイル入力のfscanfの使い方がいまいちわかりません。 テキストファイル「TEST4K01.txt」には 「A01MATSUMOTO 090075100」が入ってるのですが、それぞれ構造体に直接振り分けて格納したい為fscan関数を使って下のソースを書いたのですがコンパイルするといつも以上終了してしまいます。大変申し訳ないのですが、誰か助言を御願いします。 #include<stdio.h> #include<stdlib.h> struct score { char clas_i; char num_i; char name[10]; int eigo_i; int sugaku_i; int kokugo_i; }; FILE *ifp; int main(void) { struct score dt; if((ifp = fopen("TEST4K01.txt", "r")) == NULL){ printf("ファイルエラー\n"); exit(1); } fscanf(ifp, "%1c%2d%10c%3d%3d%3d\n", &dt.clas_i, &dt.num_i, &dt.name, &dt.eigo_i, &dt.sugaku_i, &dt.kokugo_i); printf("%s", dt.clas_i); printf("%d", dt.num_i); printf("%s", dt.name); printf("%d", dt.eigo_i); printf("%d", dt.sugaku_i); printf("%d", dt.kokugo_i); fclose(ifp); return 0; }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
※スペースはつぶされるので全角2スペース2つでインデントしています。 Windows2000sp4/VC++6sp6/Console-Appでコンパイル dt.num_iの型をint型にしました。 fscanf()で、書式を変更しました。 fscanf()で、&dt.name を dt.name にしました。 printf()で、書式を変更しました。 #include <stdio.h> #include <stdlib.h> struct score { char clas_i; int num_i; char name[10]; int eigo_i; int sugaku_i; int kokugo_i; }; int main(void) { struct score dt = {0}; FILE *ifp = NULL; if((ifp = fopen("TEST4K01.txt", "r")) == NULL){ printf("ファイルエラー\n"); exit(1); } fscanf(ifp, "%c%2d%10s%3d%3d%3d\n", &dt.clas_i, &dt.num_i, dt.name, &dt.eigo_i, &dt.sugaku_i, &dt.kokugo_i); fclose(ifp); printf("%c", dt.clas_i); printf("%02d", dt.num_i); printf("%s", dt.name); printf("%03d", dt.eigo_i); printf("%03d", dt.sugaku_i); printf("%03d", dt.kokugo_i); return 0; } -----実行例---------- A01MATSUMOTO090075100 ---------------------
その他の回答 (2)
- ysk6406
- ベストアンサー率40% (237/589)
「コンパイルすると異常終了する」とのことですが、まず、どんなエラーメッセージが出ているのかを書いて下さい。 それから、ソースをちょっと見たところでは、 > printf("%s", dt.clas_i); が、間違ってますね。 %s は、%c でなければなりません。 %s は、「NUL で終わる文字列」を表すものなので、1バイトしかなく、従って NUL で終わっていない dt.clas_i を %s で表示しようとすると、おかしなことになります。 手元の環境で上記のように直したら、一応実行できましたが…
お礼
ありがとうございます☆ ご指摘されてから気づきました。 なにぶん独学で勉強している為まだまだ未熟者で ちょっとしたミスにも気づかないのが現状です。。。 しかし、これからもめげずにがんばっていきたいと思います☆ わざわざお答えいただきありがとうございました♪
- Tacosan
- ベストアンサー率23% (3656/15482)
明らかに間違っているところ: 1.num_i は char なのに fscanf で %2d が指定されている. 2.clas_i は char なのに printf で %s が指定されている.
補足
返答ありがとうございます☆ ご指摘されたとおり直したら出力できたのですが 少し問題が出てきてしまいました。。。 名前を出力するところにMATUMOTO Aと言う最後にわけ のわからない文字が出てきてしまったのですがこれは どうしたら消えるのでしょうか?? 質問ばかりで申し訳ございません。
お礼
遅くなり本当に申し訳ございませんでした。わざわざのご回答ありがとうございました☆これからもっともっとC言語を勉強し一流のSEになれるようがんばります♪