プロが教えるわが家の防犯対策術!

 現在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;
}

A 回答 (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
---------------------
    • good
    • 0
この回答へのお礼

遅くなり本当に申し訳ございませんでした。わざわざのご回答ありがとうございました☆これからもっともっとC言語を勉強し一流のSEになれるようがんばります♪

お礼日時:2004/12/10 10:31

「コンパイルすると異常終了する」とのことですが、まず、どんなエラーメッセージが出ているのかを書いて下さい。



それから、ソースをちょっと見たところでは、

> printf("%s", dt.clas_i);

が、間違ってますね。
%s は、%c でなければなりません。
%s は、「NUL で終わる文字列」を表すものなので、1バイトしかなく、従って NUL で終わっていない dt.clas_i を %s で表示しようとすると、おかしなことになります。

手元の環境で上記のように直したら、一応実行できましたが…
    • good
    • 0
この回答へのお礼

ありがとうございます☆
ご指摘されてから気づきました。
なにぶん独学で勉強している為まだまだ未熟者で
ちょっとしたミスにも気づかないのが現状です。。。
しかし、これからもめげずにがんばっていきたいと思います☆
わざわざお答えいただきありがとうございました♪

お礼日時:2004/11/25 22:16

明らかに間違っているところ:


1.num_i は char なのに fscanf で %2d が指定されている.
2.clas_i は char なのに printf で %s が指定されている.

この回答への補足

返答ありがとうございます☆
ご指摘されたとおり直したら出力できたのですが
少し問題が出てきてしまいました。。。
名前を出力するところにMATUMOTO Aと言う最後にわけ
のわからない文字が出てきてしまったのですがこれは
どうしたら消えるのでしょうか??
質問ばかりで申し訳ございません。

補足日時:2004/11/25 22:21
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!