用 C 中的结构类型数组填充文件
Fill a file with an array of struct type in C
我需要一份购买清单文件
我声明了一个类型结构名称 purchase,它必须包含以下信息:item、price 和 购买日期 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);
}
我需要一份购买清单文件 我声明了一个类型结构名称 purchase,它必须包含以下信息:item、price 和 购买日期 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);
}