首页 > 解决方案 > fscanf 未将数据正确存储到变量中

问题描述

代码的实际作用是将整行存储到 utenti[i].username 中,所以假设在文件中我们得到"Pierluigi,Pierluigi@gmail.com,1983,messicana,30,6.5"的整行将存储到 utenti[i].username 即使用户名最大长度为 20,显然那是'不是代码的最初目的,目的是将每个值存储到正确的变量中。我已经在另一个代码中使用了这种 fopen 和 fscanf 代码,它确实有效,它将数据存储在正确的变量中,但在这里它不会工作。我试图理解为什么它不起作用,但我无法弄清楚,所以我在这里寻求帮助。

#include <stdio.h>
#include <stdlib.h>
#include "mystruct.h"//where i get my structures 

#define MAX_DIM 1000

utente utenti[MAX_DIM];

int main()
{
    FILE *utente;
    int i = 0;
    
    if ((utente = fopen("./Dati/utenti.csv", "r")) == NULL)
                 printf("Impossibile aprire il file.\n");
             else{
                   while(!feof(utente)){
                   fscanf(utente,"%s,%s,%d,%s,%f,%f", utenti[i].username, utenti[i].email, &utenti[i].n_anno, utenti[i].tradizione, &utenti[i].fasciadiprezzo, &utenti[i].media_voti);
                  printf("utenti : %s\n", utenti[i].username);
                  i++;
                }
         }
         fclose(utente);
         return 0;
}

这是mystruct.h中包含的结构

typedef struct utente{
   char username[20];
   char email[30];
   int  n_anno;//anno di nascita
   char tradizione[20];
   float fasciadiprezzo;
   float media_voti;
   struct prenotazione *p_prenotabili;
   struct recensione *valutazioni;
}utente;

其中“prenotazioni ...”和“recensione ...”是链表

我用 vs_code 编程

标签: c

解决方案


问题在于您的格式字符串:

fscanf(utente,"%s,%s,%d,%s,%f,%f", 
              utenti[i].username, utenti[i].email,
              &utenti[i].n_anno, utenti[i].tradizione,
              &utenti[i].fasciadiprezzo, &utenti[i].media_voti);

格式说明%s符读取所有非空白字符。由于逗号和数字不是空格,因此它们都由 first 读取%s

而不是%s,你想使用%[. 这允许您指定要捕获或不捕获的一组字符。由于您想阅读所有内容,直到逗号,您需要%[^,]. 格式字符串的开头还应该有一个空格来吸收前一行中的任何换行符。

fscanf(utente, " %[^,],%[^,],%d,%[^,],%f,%f",
               utenti[i].username, utenti[i].email,
               &utenti[i].n_anno, utenti[i].tradizione,
               &utenti[i].fasciadiprezzo, &utenti[i].media_voti);

另外,看看为什么while (!feof(file))总是错误的。


推荐阅读