将结构写入文件 C
Writing structs into a file C
我刚刚开始学习文件。为此,我正在尝试创建一个程序来跟踪商店中的交易记录。第一步是记录一天的交易。我创建了一个文件 trans.c,我可以将其与 main.c 文件一起打开,以便对其进行跟踪。然后我首先用空结构填充 trans.c 来为事务记录分配内存,然后我使用 fwrite 用包含客户端数据的结构填充它。
#include <stdio.h>
#include <stdlib.h>
/*
*
*/
struct clientData {
int num;
char fName [20];
char lName[20];
long double balance;
};
void createFiles (FILE *fNew, FILE *fOld, FILE *fTrans, struct clientData x);
void fillTrans (FILE *fTrans, struct clientData x);
int main() {
FILE *fTrans; //transaction file
FILE *fNew; //new master file
FILE *fOld; //old master file
struct clientData blankClient = {0, "", "", 0.0 };
if ((fTrans = fopen("trans.c", "wb")) == NULL) {
printf("Error. File could not be opened.\n");
}
else {
int i;
for (i = 1; i <= 100; i++) {
fwrite(&blankClient, sizeof(struct clientData), 1, fTrans);
}
}
fillTrans(fTrans, blankClient);
}
void fillTrans(FILE *fTrans, struct clientData x) {
if ((fTrans = fopen("trans.c", "a+")) == NULL) {
printf("File could not be opened.");
}
else {
printf("Enter the account info, or 0 to quit.\n");
scanf("%d%s%s%Lf", &x.num, x.fName, x.lName, &x.balance);
while (x.num!= 0) {
fseek(fTrans, (x.num - 1) * sizeof(struct clientData), SEEK_SET);
fwrite(&x, sizeof(struct clientData), 1, fTrans);
fscanf(stdin, "%d%s%s%Lf", &x.num, x.fName, x.lName, &x.balance);
}
fclose(fTrans);
}
}
当我返回 trans.c 查看它是否有效时,文件仍然是空的,但我的代码编译没有问题,并且在 运行 时间我似乎没有填写结构并将它们写入时遇到问题。文件是在其他地方填写的,还是我错过了 something/doing 这个错误?
您在 main 中打开 "trans.c",然后调用 fillTrans()
而没有先关闭它 -- 因此您在 fillTrans()
中写入数据时打开了文件两次。如果您 运行 的设置允许两次打开都成功(在某些情况下,文件锁定会阻止它),那么最后一个关闭的设置可能决定文件的最终内容。由于 main()
不会关闭它(因此它的副本会在程序结束时关闭),您最终会得到 main()
放入文件中的任何内容并丢弃 fillTrans()
通过第二个 FILE *
。
文件中 fillTrans()
的 部分 写入可能会结束(如果不附加),但文件大小会仍由 main()
所拥有的内容以及文件的哪些部分的数据不易预测所决定。
此外,如果来自 fillTrans()
的写入仍然存在,它们将被添加到文件的末尾,在任何 main()
写入已经刷新到磁盘(如果有的话)之后,因为 fillTrans()
以追加模式打开。
我刚刚开始学习文件。为此,我正在尝试创建一个程序来跟踪商店中的交易记录。第一步是记录一天的交易。我创建了一个文件 trans.c,我可以将其与 main.c 文件一起打开,以便对其进行跟踪。然后我首先用空结构填充 trans.c 来为事务记录分配内存,然后我使用 fwrite 用包含客户端数据的结构填充它。
#include <stdio.h>
#include <stdlib.h>
/*
*
*/
struct clientData {
int num;
char fName [20];
char lName[20];
long double balance;
};
void createFiles (FILE *fNew, FILE *fOld, FILE *fTrans, struct clientData x);
void fillTrans (FILE *fTrans, struct clientData x);
int main() {
FILE *fTrans; //transaction file
FILE *fNew; //new master file
FILE *fOld; //old master file
struct clientData blankClient = {0, "", "", 0.0 };
if ((fTrans = fopen("trans.c", "wb")) == NULL) {
printf("Error. File could not be opened.\n");
}
else {
int i;
for (i = 1; i <= 100; i++) {
fwrite(&blankClient, sizeof(struct clientData), 1, fTrans);
}
}
fillTrans(fTrans, blankClient);
}
void fillTrans(FILE *fTrans, struct clientData x) {
if ((fTrans = fopen("trans.c", "a+")) == NULL) {
printf("File could not be opened.");
}
else {
printf("Enter the account info, or 0 to quit.\n");
scanf("%d%s%s%Lf", &x.num, x.fName, x.lName, &x.balance);
while (x.num!= 0) {
fseek(fTrans, (x.num - 1) * sizeof(struct clientData), SEEK_SET);
fwrite(&x, sizeof(struct clientData), 1, fTrans);
fscanf(stdin, "%d%s%s%Lf", &x.num, x.fName, x.lName, &x.balance);
}
fclose(fTrans);
}
}
当我返回 trans.c 查看它是否有效时,文件仍然是空的,但我的代码编译没有问题,并且在 运行 时间我似乎没有填写结构并将它们写入时遇到问题。文件是在其他地方填写的,还是我错过了 something/doing 这个错误?
您在 main 中打开 "trans.c",然后调用 fillTrans()
而没有先关闭它 -- 因此您在 fillTrans()
中写入数据时打开了文件两次。如果您 运行 的设置允许两次打开都成功(在某些情况下,文件锁定会阻止它),那么最后一个关闭的设置可能决定文件的最终内容。由于 main()
不会关闭它(因此它的副本会在程序结束时关闭),您最终会得到 main()
放入文件中的任何内容并丢弃 fillTrans()
通过第二个 FILE *
。
文件中 fillTrans()
的 部分 写入可能会结束(如果不附加),但文件大小会仍由 main()
所拥有的内容以及文件的哪些部分的数据不易预测所决定。
此外,如果来自 fillTrans()
的写入仍然存在,它们将被添加到文件的末尾,在任何 main()
写入已经刷新到磁盘(如果有的话)之后,因为 fillTrans()
以追加模式打开。