簡體   English   中英

fgetc跳過文件中的第一個字符

[英]fgetc skips first character in file

在while循環中,fgetc命令正在跳過第一個字符,而我似乎無法弄清楚原因。

void generate_people(FILE *p, struct person *a){
    int c;

    while((c = getc(p)) != EOF){
        fscanf(p, "%s %[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ], 
          %[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ] %d, %d %s.", 
            a->fornavn, a->efternavn, a->vejnavn, 
            &a->vejnummer, &a->postnummer, a->bynavn);
        a++; 
    }    
}

第一個字符在c 使用fscanf()的結果代替(c = getc(p)) != EOF來檢測錯誤或EOF

void generate_people(FILE *p, struct person *a)
{
    while (fscanf(p, "%s %[a-zA-Z], %[a-zA-Z] %d, %d %s.",
                     a->fornavn, a->efternavn, a->vejnavn, 
                     &a->vejnummer, &a->postnummer, a->bynavn) == 6)
    {
        ++a; 
    }    
}

完整示例:

#include <stdlib.h>
#include <stdio.h>

struct person {
    char fornavn[30];
    char efternavn[30];
    char vejnavn[30];
    int  vejnummer;
    int  postnummer;
    char bynavn[30];
};

struct person* generate_people(FILE *p, struct person *a)
{
    while (fscanf(p, "%29s %29[a-zA-Z], %29[a-zA-Z] %d, %d %29s",  // ****)
           a->fornavn, a->efternavn, a->vejnavn,
           &a->vejnummer, &a->postnummer, a->bynavn) == 6)
    {
        ++a;
    }
    return a;
}

void person_print(struct person *a)
{
    printf("\"%s\" \"%s\", \"%s\" %d, %d \"%s\"\n",
           a->fornavn, a->efternavn, a->vejnavn,
           a->vejnummer, a->postnummer, a->bynavn);
}

int main(void)
{
    char const *filename = "test.txt";
    FILE *input = fopen(filename, "r");

    if (!input) {
        fprintf(stderr, "Couldn't open \"%s\" for reading :(\n\n", filename);
        return EXIT_FAILURE;
    }

    struct person people[10];
    struct person *end = generate_people(input, people);

    for (struct person *i = people; i != end; ++i)
        person_print(i);

    fclose(input);
}

輸入文件:

Lars Jensen, Engtoften 23, 7182 Bredsten
Bo Olsen, Vestergade 56, 4261 Dalmose
Kurt Jensen, Haderslevvej 15, 8370 Hadsten
Birte Madsen, Universitetsvej 899, 9000 Aalborg
Kaj Moberg, Halevindingevej 2, 2670 Greve
Bo Rise, Hadsund Landvej 56, 8900 Randers

輸出:

"Lars" "Jensen", "Engtoften" 23, 7182 "Bredsten"
"Lars" "Jensen", "Engtoften" 23, 7182 "Bredsten"
"Bo" "Olsen", "Vestergade" 56, 4261 "Dalmose"
"Kurt" "Jensen", "Haderslevvej" 15, 8370 "Hadsten"
"Birte" "Madsen", "Universitetsvej" 899, 9000 "Aalborg"
"Kaj" "Moberg", "Halevindingevej" 2, 2670 "Greve"

****)請不要在沒有指定要讀取的字段寬度的情況下, 永遠不要*scanf()使用"%s""%NNNs"其中NNN是字符數。 對於大小為30的數組: "%29" ... 29 + 1表示終止0。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM