
現在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;
}
No.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
---------------------
遅くなり本当に申し訳ございませんでした。わざわざのご回答ありがとうございました☆これからもっともっとC言語を勉強し一流のSEになれるようがんばります♪

No.2
- 回答日時:
「コンパイルすると異常終了する」とのことですが、まず、どんなエラーメッセージが出ているのかを書いて下さい。
それから、ソースをちょっと見たところでは、
> printf("%s", dt.clas_i);
が、間違ってますね。
%s は、%c でなければなりません。
%s は、「NUL で終わる文字列」を表すものなので、1バイトしかなく、従って NUL で終わっていない dt.clas_i を %s で表示しようとすると、おかしなことになります。
手元の環境で上記のように直したら、一応実行できましたが…
ありがとうございます☆
ご指摘されてから気づきました。
なにぶん独学で勉強している為まだまだ未熟者で
ちょっとしたミスにも気づかないのが現状です。。。
しかし、これからもめげずにがんばっていきたいと思います☆
わざわざお答えいただきありがとうございました♪
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
#defineが使用するメモリ領域に...
-
printf による16進表示について
-
Enterキーを押されたら次の処理...
-
0x8, スペース, 0x8をプログラ...
-
タイムカードのシステムを作り...
-
HANDLEのエラー
-
最早開始時間と最遅完了時刻を...
-
20'(角度)の計算がわかりま...
-
信頼区間の1.96や1.65ってどこ...
-
Aの値からBの値を除するとは??
-
数字以外が入力されたらエラー...
-
値差の%計算方法について
-
「Aに対するBの割合」と「Aに対...
-
cout関数を使っているのですが...
-
2÷3などの余りについて
-
構造体の勉強中です 合計点の高...
-
main.c:7:43: warning: implici...
-
C言語 エラーの原因がわからな...
-
CTabCtrl:TABインデックス単位...
-
ExcelでPC(パソコン)によって...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
【C言語】全角文字の配列を、全...
-
#defineが使用するメモリ領域に...
-
printf による16進表示について
-
reallocでエラー
-
エラーについて質問です。
-
static付き宣言の初期化
-
char型2つを結合し、short型に...
-
WinInetのInternetOpenUrl関数...
-
空白を含んだ文字列がうまく格...
-
C言語でファイルから複素数の値...
-
C言語で複数列のデータを1列の...
-
Cプログラムについて
-
C++で指定文字列のカウント方法...
-
プログラミング ポインタを使...
-
ビルドエラーの対処がわからな...
-
リストの作成と出力(C言語)
-
setjmp・longjmpに関しまして
-
C言語でのCSVファイルの読み出...
-
2進数の表示
おすすめ情報