0

これは私のコードです:

#include <stdio.h>
#define N 4
#define A_INPUT "agents.txt"

typedef struct
{
    long id;
    char lastName[20];
    char name[20];
    char type;
    int workHours;
    long managId;
    int sell[10];
} Agents;

Agents AgArr[N]={0};

void main()
{
    int i,j=1;
    FILE*agents;
    agents=fopen(A_INPUT,"r");

    if(agents == NULL)
    {
        printf("Unable to open file.\n");
        exit();
    }

    for (i=0; i<N; i++)
    {
        fscanf(agents, "%ld", &AgArr[i].id);
        fscanf(agents, "%s", &AgArr[i].lastName);
        fscanf(agents, "%s", &AgArr[i].name);
        fscanf(agents, "%c", &AgArr[i].type);
        fscanf(agents, "%d", &AgArr[i].workHours);
        fscanf(agents, "%ld", &AgArr[i].managId);
    } 
}

これは私が読んでいるテキストファイルです:

045654987 Cohen Yael P 135 302546887
024587891 Cohen Rafi F 150 -1
306354487 Gabai Shai P 112 302546887
302546887 Benzur Gadi M 130 -1

問題は、配列がすべてのテキストを取得しておらず、スペースと0を取得していることです。正しくスキャンするにはどうすればよいですか?

4

1 に答える 1

3

fscanf(3)のドキュメントを注意深く読む必要があります(さらに 2 回読む必要があります)。

fscanf次に、おそらくフォーマット文字列にスペースが必要になる理由を理解してください。

    if (fscanf(agents," %ld %s",&AgArr[i].id, &AgArr[i].lastName)==2) {

(実際にはそれ以上になる可能性があり、おそらくそれ以上になるはずです。fscanf半ダースの引数を使用して単一の長い呼び出しを行うこともできますが、 の結果をテストする必要がありますfscanf)。

そして、その結果fscanfが意味のあるものかどうかをテストする必要があります。

あなたのforループはおそらく

 for (i=0; !feof(agents) && i<10; i++)

そして、FILE*変数に名前を付けて、それが何らかのファイル(エージェントのセットではない)であることを思い出させる名前をagf付ける必要があると思いagents_fileます。agents

于 2013-01-05T20:04:13.550 に答える