0

新しい質問: ファイルから構造体の配列にデータを読み込む必要があり、scanf 関数でエラーが発生します。構造へのスキャンの詳細については、本当によくわかりません。これは私が書いたものです:

#include <stdio.h>
#include <string.h>
#include <math.h>

#define runnum 500
#define charnum 20

typedef struct {
        unsigned long bibnum;
        char lastname[charnum];
        char fistname[charnum];
        int grade;
        char team[charnum];
        char state[charnum];
        int time1;
        float time2;
    } runner_t;

int main(void)
{
    int i;
    FILE *ifile, *jfile;

    ifile = fopen("20121006.boys.txt", "r");
    jfile = fopen("20121006.girls.txt", "r");

    runner_t runarray[runnum]; 

    i = 0;

    while  (i < runnum)
        {
            scanf(ifile, "%ul", &runarray[i].bibnum);
            scanf(ifile, "%s", &runarray[i].lastname);
            scanf(ifile, "%s", &runarray[i].firstname);
            scanf(ifile, "%d", &runarray[i].grade);
            scanf(ifile, "%s", &runarray[i].team);
            scanf(ifile, "%s", &runarray[i].state);
            scanf(ifile, "%d", &runarray[i].time1);
            scanf(ifile, "%f", &runarray[i].time2);
        printf("%d %s %s %d %s %s %d:%f", runarray[i].bibnum, runarray[i].lastname, runarray[i].firstname, runarray[i].grade, runarray[i].team, runarray[i].state, runarray[i].time1, runarray[i].time2); 
        i++;
     }
4

3 に答える 3

0
#include <stdio.h>
#include <string.h>
#include <math.h>

#define RUNNUM 500
#define CHARNUM 20

typedef struct {
        unsigned long bibnum;
        char lastname[CHARNUM];
        char firstname[CHARNUM];
        int grade;
        char team[CHARNUM];
        char state[CHARNUM];
        int time1;
        float time2;
    } runner_t;

int main(void)
{
    int i;
    FILE *ifile, *jfile;

    ifile = fopen("20121006.boys.txt", "r");
    jfile = fopen("20121006.girls.txt", "r");

    runner_t runarray[RUNNUM];

    for (i=0; i < RUNNUM; i++)
        {
            fscanf(ifile, "%lu", &runarray[i].bibnum);
            fscanf(ifile, "%s", runarray[i].lastname);
            fscanf(ifile, "%s", runarray[i].firstname);
            fscanf(ifile, "%d", &runarray[i].grade);
            fscanf(ifile, "%s", runarray[i].team);
            fscanf(ifile, "%s", runarray[i].state);
            fscanf(ifile, "%d", &runarray[i].time1);
            fscanf(ifile, "%f", &runarray[i].time2);
        printf("%lu %s %s %d %s %s %d:%f"
        , runarray[i].bibnum
        , runarray[i].lastname, runarray[i].firstname
        , runarray[i].grade, runarray[i].team
        , runarray[i].state
        , runarray[i].time1, runarray[i].time2);

     }
return 0;
}

ここでコンパイルします。

于 2013-10-27T19:51:55.900 に答える
0

エディターの問題は純粋に表面的なものです。代わりにこれを試すことができます:

typedef struct runner_t {
    // ...
} runner_t;

ただし、_t接尾辞は POSIX システム (Mac OS X や Linux など) で予約されていることに注意してください。代わりに使用するか_type、接尾辞をまったく使用しない方がよいでしょう。

ただし、問題 (コンパイル エラー) は別の場所にあります。まず、scanf()代わりに を使用していますfscanf()scanf()は常にstdinストリームから読み取り、引数はありませんFILE*(最初の引数として a を渡そうとすると、代わりFILE*に常に aが必要になるため、コンパイラはそれをエラーと見なしconst char*ます)。独自のファイル ストリームから読み取るには、 を使用する必要がありますfscanf()。これはFILE*引数を取ります。例えば:

fscanf(ifile, "%lu", &runarray[i].bibnum);

注:%luではなく%ulです)。

また、文字列を読み取るとき、文字列が既にポインターであっても、ポインターを渡していることに注意してください。

fscanf(ifile, "%s", &runarray[i].lastname);

はすでにポインターなのでrunner_t.lastname、そのまま渡すだけです。

fscanf(ifile, "%s", runarray[i].lastname);

さらに、runner_t.firstname構造体宣言のスペルが間違っています。あなたはそれに名前を付けましたfistname。それも変えてください。

最後に、 で、print の書式指定子としてprintf()を使用します。であるため、使用する必要があります。%dbignumunsigned long%lu

于 2013-10-27T19:11:59.330 に答える