
現在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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
Cプログラムについて
-
【C言語】全角文字の配列を、全...
-
空白を含んだ文字列がうまく格...
-
C言語で複数列のデータを1列の...
-
ビルドエラーの対処がわからな...
-
#defineが使用するメモリ領域に...
-
プログラミングの授業の課題です
-
C++で指定文字列のカウント方法...
-
コマンドファイルから、ビット...
-
エラーについて質問です。
-
csvファイルの読み取り
-
複数桁10進数の*桁目だけを抽出...
-
float と double
-
float型とdouble型の変数の違い...
-
「指定されたキャストは有効で...
-
「Aに対するBの割合」と「Aに対...
-
Aの値からBの値を除するとは??
-
[C++]メンバ関数の仮引数について
-
DWORDの実際の型は何でしょうか
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
【C言語】全角文字の配列を、全...
-
#defineが使用するメモリ領域に...
-
C言語で複数列のデータを1列の...
-
printf による16進表示について
-
char型2つを結合し、short型に...
-
空白を含んだ文字列がうまく格...
-
矢印キーを押下してコンソール...
-
C++で指定文字列のカウント方法...
-
コマンドファイルから、ビット...
-
C言語のプログラムで、途中で止...
-
終了条件Ctrl+zについて,結果表...
-
配列への文字列の格納について
-
困ってます!書き方がわかりま...
-
ファイルから数字列を16進数の...
-
fread(),fwrite()等について
-
0x8, スペース, 0x8をプログラ...
-
static付き宣言の初期化
-
構造体メンバの初期化
-
c言語で文書を読み込み、単語の...
おすすめ情報