【问题标题】:Fill a file with an array of struct type in C用 C 中的结构类型数组填充文件
【发布时间】:2021-01-19 11:51:07
【问题描述】:

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

这是代码来源:

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

【问题讨论】:

  • 你确定不需要打印T[0]
  • 也许阅读documentation for fprintf 会很有启发性。了解所调用的函数的实际作用以及它们期望的参数是什么,这总是会更好。
  • 您没有显示调用该函数的代码,因此我们无法判断那里出了什么问题。循环应该是for (int i = 0; i &lt; N; i++) 循环。您需要在对fprintf() 的调用中提供格式。

标签: c file printf


【解决方案1】:

你需要在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 用于 int。

我建议您在尝试写入文件之前检查文件是否已打开(如果文件未打开,文件指针将是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);
}

【讨论】:

    【解决方案2】:

    您必须使用格式说明符才能使用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 */
    }
    

    【讨论】:

    • 嗨 MikeCat,答案很好,而且比 mine 更快!除了 OP 代码附带的非同质格式之外,还存在逻辑错误:购买的最后一个元素不会写入文件中,因为 i 从 1 开始,而您的循环条件是 i &lt; N .
    • @gsamaras 不会被写入的元素可能是第一个。
    • 确实是MikeCat,i等于1的时候第一个元素会被跳过对吧! ;) 所以你可以通过将i 初始化为 0 来修正你的答案。:)
    猜你喜欢
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 2015-09-04
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    相关资源
    最近更新 更多