用 C 中的结构类型数组填充文件

Fill a file with an array of struct type in C

我需要一份购买清单文件 我声明了一个类型结构名称 purchase,它必须包含以下信息:itemprice购买日期 day/month/year 按购买日期排序。 但是它不起作用,我不知道为什么。

这是代码源:

#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++;
    }
}

您必须使用 格式说明符 才能使用 fprintf()

还应检查 fopen() 的结果,并应关闭打开的文件。

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

  FILE * P_Fichier;
  P_Fichier=fopen(Name_F,"w");
  if (P_Fichier == NULL) return; /* check if file open is successful */
  int i=1;
  while (i< N )
    {
      fprintf(P_Fichier,"%s\n",T[i].item); /* %s for strings */
      fprintf(P_Fichier,"%f\n",T[i].price); /* %f for float */
      fprintf(P_Fichier,"day:%d, month:%d, year:%d\n", /* %d for int */
        T[i].date_purchase.day, T[i].date_purchase.month, T[i].date_purchase.year);
      i++;
    }
  fclose(P_Fichier); /* close file when done */
}

您需要在 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);

这些也是与 printf() 一起使用的典型格式说明符,因此 %s 用于字符串,%f 用于浮点数,%d 用于整数。

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


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

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);
}