【问题标题】:How to properly use fscanf and fgets to read from file如何正确使用 fscanf 和 fgets 从文件中读取
【发布时间】:2017-05-09 15:23:43
【问题描述】:

我是 C 编程新手(这是我的第一语言),而且我的英语不太好,所以对语法感到抱歉...顺便说一句,我想知道您是否可以帮我解决这个问题: 我必须从文件中读取数组的组件,将它们设置为它的一部分,并将它们作为屏幕中的输出。 我用这些信息创建了一个文件:

罗西,马里奥,M,mariorossi@gmail.com,3923333332,Portiere Bianchi,Giuseppe,M,giuseppebianchi@gmail.com,3470000021,Attaccante 法拉利,Anna,F,annaferrari@gmail.com,3466482645,Attaccante Romano,Antonio,M,antonioromano@gmail.com,3450394672,Centrocampista

并尝试编码我最终得到了这个:

    #include <stdio.h>
    #include <stdlib.h>
    struct dati_giocatori {
        char cognome[20];
        char nome[20];
        char genere[20];
        char email[20];
        int telefono;
        char ruolo[20];
    };

    typedef struct dati_giocatori GIOCATORE;

    void lettura(FILE *file, GIOCATORE *vettore, int dim);
    void stampa(GIOCATORE *vettore, int dim);

    int main (){
        FILE *file;
        GIOCATORE *vettore;
        int dim;

        vettore=(GIOCATORE*)malloc(dim*sizeof(GIOCATORE));
        printf("how many players do you want to see?");
        scanf("%d",&dim);


        file=fopen("Giocatori.txt","r");

        lettura(file,vettore,dim);
        stampa(vettore,dim);

        system("pause");
        return 0;

    }

    void lettura(FILE *file, GIOCATORE *vettore, int dim){
        int i=0;
        if(file){
                while(!feof(file) && i<dim){
                    fscanf(file,"%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],[^\n]", vettore[i].cognome,vettore[i].nome,vettore[i].genere,vettore[i].email,&vettore[i].telefono,vettore[i].ruolo);
                i++;
                }
            }
            else{
                printf("Error.");
            }
    }


    void stampa(GIOCATORE *vettore, int dim){
        int i=0;
        while(i<dim){
            printf("%s,%s,%s,%s,%d,%s\n", vettore[i].cognome,vettore[i].nome,vettore[i].genere,vettore[i].email,vettore[i].telefono,vettore[i].ruolo);
        i++;
        }
    }

但效果不是很好。我知道我的 fscanf 有一些问题(可能),我想知道 malloc 是否使用正确......你能帮我吗?我犯的错误在哪里?我该如何解决它们?代码应该如何使用 fgets 而不是 fscanf?我是否以正确的方式使用分隔符?

好的,非常感谢您的回复,我会将 10 位电话号码与长变量一起处理,但我仍然不明白应该如何正确使用 fscanf。这是第一次使用分隔符,这让我感到困惑。我的格式说明符是“%s,%s,%s,%s,%ld,%s”,对吧?但我应该如何将它们放入 fscanf 中? fscanf中的“file”参数后面要写什么?

【问题讨论】:

  • 您不能将%[^,] 用于int。所以例如int telefono; --> char telefono[16];
  • 是的,将电话号码存储为字符串。普通的 32 位有符号整数不能保存您的电话号码:3,450,394,672 大于 2³ ¹ = 2,147,483,648。
  • 非常感谢您的回复,我遇到了“int telefono”的问题,但我仍然没有得到正确格式的 fscanf 与 demitators,我应该在之后写什么fscanf中的第一个参数“file”?

标签: c file scanf


【解决方案1】:
fscanf(file,"%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],[^\n]",...

您的格式说明符不正确;如果您告诉fscanf 要读取的数据是逗号分隔的,您使用括号外的逗号执行此操作,则无需指定放入的内容 ([^,]),并且您缺少格式说明符.尝试提供 fscanf 与您在 stampa 函数中提供给 printf 的相同格式。 注意:整数变量不能正确保存 10 位电话号码,请使用 long 变量或将其视为字符串。

另一方面,fgets 会将整行读入字符串缓冲区,因为它不接受格式说明符,因此您最终将只有一个字符串,包含整行,然后您应该解析它使用sscanf 之类的东西,你应该使用fscanf

【讨论】:

  • 好的,非常感谢您的回复,我会用长变量处理10位电话号码,但我仍然不明白应该如何正确使用fscanf。这是第一次使用分隔符,这让我感到困惑。我的格式说明符是“%s,%s,%s,%s,%ld,%s”,对吧?但我应该如何将它们放入 fscanf 中? fscanf中的“file”参数后面要写什么?
  • 原型是int fscanf(FILE *stream, const char *format, ...),其中const char* format是一个包含说明符的字符串,以及相关目标变量的列表;例如:fscanf(stdin, "%d", &amp;myInt)stdin 中读取一个整数并将其保存到myInt。在您的情况下,它将是fscanf(file, "%s %s %s %ld %s", vettore.nome, vettore.cognome, ...)。请注意,两个格式说明符之间的空格告诉fscanf 期望读取每个字符串/数字之间的空格。
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多