c - 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 编程
解决方案
问题在于您的格式字符串:
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))
总是错误的。
推荐阅读
- google-sheets - 谷歌表格 COUNTIF
- html - WooCommerce 的 Wordpress 变体色板 选定项目刻度线
- node.js - docker容器中的Nginx proxy_pass不处理静态文件
- html - 如何更改活动引导下拉元素的背景颜色?
- python - 将 TensorFlow 模型转换为 Lite 时出错
- c++ - 为什么 clang++ 和 g++ 不对这些指令进行重复数据删除?
- simd - 压缩整数和扩展压缩整数之间的区别
- flutter - 有没有办法在 Flutter 中做音频会议室?
- c++ - 需要带有纯抽象类类型参数的子句?
- sql - SQL oracle我如何将不同表中的两列相乘并将结果列放在两个表之一中