繁体   English   中英

fscanf和fgets用于c中的文本文件(int,string,string和float)

[英]fscanf and fgets for a text file (int, string, string and float) in c

我正在尝试使用文本文件创建4个数组。 文本文件如下所示:

1000 Docteur             Albert              65.5
1001 Solo                Hanz                23.4
1002 Caillou             Frederic            78.7
…

编码:

void creer (int num[], char pre[][TAILLE_NP+1], char nom[][TAILLE_NP+1], 
float note[], int * nb ){

  int  n = 0, i; /*nb personnes*/

  FILE *donnees = fopen("notes.txt", "r");

  if(!donnees){
    printf("Erreur ouverture de fichier\n");
    exit(0);
  }

  while (!feof(donnees)){

    fscanf(donnees,"%d", &num [n]);
    fgets(nom[n], TAILLE_NP+1, donnees);
    fgets(pre[n], TAILLE_NP+1, donnees);
    fscanf(donnees,"%f\n", &note[n]);

    printf("%d %s %s %f\n",num[n], nom[n], pre[n], note[n]);
    n++;
    }

  fclose (donnees);

  *nb = n ;
  }


int main() {

  int num[MAX_NUM];
  int nbEle;

  char pre[MAX_NUM][TAILLE_NP+1],
       nom[MAX_NUM][TAILLE_NP+1];

  float note[MAX_NUM];

  creer (num, pre, nom, note, &nbEle);

  printf("%s", pre[2]); //test

  return 0; 
}

问题是,我敢肯定,对于初学者来说,有更好的方法来创建数组。 另外,浮点数有问题,当我打印f时,小数点不正确。 例如,78.7变为78.699997。 我究竟做错了什么? 谢谢 ! :)

这里有两个问题:

  1. 混合使用fscanf()fgets()是一个坏主意,因为前者在一行的一部分上工作而后者在整行上工作。

  2. float不如您预期的那么精确。


解决1:

fscanf(donnees, "%d", &num[n]);
fscanf(donnees, "%s", nom[n]);
fscanf(donnees, "%s", pre[n]);
fscanf(donnees, "%f\n", &note[n]);

为了避免溢出“字符串”,您可以告诉fscanf()最多扫描多少个char ,例如,对42个char的字符串使用"%42s" (不计算以0结尾的char )。


解决2:

使notedouble并执行

fscanf(donnees,"%lf\n", &note[n]);

这里有几个问题:

浮点运算非常棘手。 阅读浮点gui.de (并记住该URL)。

不要在调用栈上分配巨大的自动变量 一个典型的呼叫帧应不超过几千字节(并且您的整个呼叫堆栈应少于一或几兆字节)。 使用C动态内存分配

C只有一维数组。 如果需要更好,请创建一些抽象数据类型(通常应避免使用数组数组)。 看看这个灵感。

仔细阅读每个标准功能的文档 您应该测试fscanf的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM