将.txt文件中的多行数据扫描到struct数组中

时间:2018-05-20 10:50:41

标签: c

我有一个文本文件,其中信息如下所示:

int main(void) {
int opcija=0;
U *ucenici=NULL;



while(opcija !=4){
    printf("Odaberite opciju:\n 1.Stvaranje datoteke ucenici.txt\n 2.Upisivanje novog ucenika\n 3.Pregled ucenika\n 4.Izlaz iz programa\n");
    scanf("%d", &opcija);
switch (opcija) {
case 1:
    kreiranje();
    break;

case 2:
    dodavanje();
    break;
case 3:
    void citanje1(U *ucenici);
    int j=brojanjelinija();
    for (int i = 0;i < j; i++) {
        printf("%d. %s %s\n", i + 1, ucenici[i].ime, ucenici[i].prezime);
    }
}


}
return 0;
}




void citanje1(U **ucen) {
    FILE* pok = NULL;
    pok = fopen("ucenici.txt", "r");
    int broj = brojanjelinija();
    ucen = (U**)malloc(broj * sizeof(U*));
    for (int i = 0;i < broj;i++) {
        fscanf(pok, "%s %s %d %d %d %d %d %d %d %d %d %d %d \n", ucen[i]->ime, ucen[i]->prezime, ucen[i]->dan, ucen[i]->mjesec, ucen[i]->godina, ucen[i]->mat, ucen[i]->hrv, ucen[i]->eng, ucen[i]->hidr, ucen[i]->fiz, ucen[i]->term, ucen[i]->oet, ucen[i]->tehmat);
    }

    free(ucen);
}

我可以继续添加它。 我想要做的是有一个函数读取该信息并放入struct数组,但是我遇到指针问题并弄清楚如何读取一行,然后是下一行等等。我知道读取atm的函数坏了,我尝试了一堆东西,无法搞清楚。对不起,如果它有点愚蠢的问题。

由source.c

#ifndef HEADER_H
#define HEADER_H



typedef struct ucenik{
    char ime[10];
    char prezime[10];
    int* dan;
    int* mjesec;
    int* godina;
    int* mat;
    int* hrv;
    int* eng;
    int* hidr;
    int* fiz;
    int* term;
    int* oet;
    int* tehmat;

}U;
void kreiranje(void);
void dodavanje();
int brojanjelinija();
void citanje1(U);
#endif // HEADER_H

Header.h

{{1}}

1 个答案:

答案 0 :(得分:2)

您要用于存储整数的所有ucinek数据成员实际上应该存储int而不是int*

int dan;
int mjesec;
...etc...

请记住,指针告诉编译器在哪里找到其他数据,而不是自己存储有意义的值。

然后您的fscanf行应该更改以传递指向整数的指针,您可以使用&运算符获取整数:

fscanf(pok, "%s %s %d %d %d %d %d %d %d %d %d %d %d\n",
       ucen[i]->ime, ucen[i]->prezime, &ucen[i]->dan, &ucen[i]->mjesec,
       &ucen[i]->godina, &ucen[i]->mat, &ucen[i]->hrv, &ucen[i]->eng,
       &ucen[i]->hidr, &ucen[i]->fiz, &ucen[i]->term, &ucen[i]->oet,
       &ucen[i]->tehmat);

这些指针告诉fscanf存储解析值的位置。

我从不使用fscanf而不检查返回值:它表示从输入中成功解析了多少个值并存储了它们。如果它不是您期望的号码,则应打印错误消息。