首页 > 解决方案 > 用 C 中的结构类型数组填充文件

问题描述

我需要一个带有购买清单的文件我声明了一个类型结构名称购买,它必须包含以下信息:项目价格购买日期,按购买日期排序的日/月/年。但它不起作用,我不知道为什么。

这是代码源:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

typedef struct Date {
  int day,month,year;
} Date;

typedef struct purchase{
  char item[20];
  float price;
  Date date_purchase;
} purchase;


void fillFile(char Name_F[30] , purchase T[30] , int N) {

  FILE * P_Fichier;
  P_Fichier=fopen(Name_F,"w");
  int i=1;
  while (i< N )
    {
      fprintf(P_Fichier,T[i].item);
      fprintf(P_Fichier,T[i].price);
      fprintf(P_Fichier,T[i].date_purchase);
      i++;
    }
}

标签: cfileprintf

解决方案


您需要在 中指定格式说明符fprintf(),如下所示:

fprintf(P_Fichier, "%s\n", T[i].item);
fprintf(P_Fichier, "%f\n", T[i].price);
fprintf(P_Fichier, "%d/%d/%d\n", T[i].date_purchase.day, T[i].date_purchase.month, T[i].date_purchase.year);

这些也是使用 with 的典型格式说明符printf(),因此%s对于 string、%ffloat 和%dint。

我建议您在尝试写入文件之前检查文件是否已打开(如果文件未打开,文件指针将是NULL)。完成数据写入后,您还需要关闭文件,例如fclose(P_Fichier);.


此外,i应该从 0 开始,否则你会跳过你的第一个元素。但是,由于您已经知道希望循环执行多少次,我建议您使用 for 循环,如下所示:

for (int i = 0; i < N; ++i)

把所有东西放在一起,你应该得到:

void fillFile(char Name_F[30], purchase T[30], int N) {
  FILE* P_Fichier;
  P_Fichier = fopen(Name_F, "w");
  if (P_Fichier == NULL) {
    # file failed to open
    fprintf(stderr, "Unable to open %s file.\n", Name_F);
    return;
  }
  for (int i = 0; i < N; ++i) {
    fprintf(P_Fichier, "%s\n", T[i].item);
    fprintf(P_Fichier, "%f\n", T[i].price);
    fprintf(P_Fichier, "%d/%d/%d\n", T[i].date_purchase.day, T[i].date_purchase.month, T[i].date_purchase.year); 
  }
  fclose(P_Fichier);
}

推荐阅读