将结构写入文件 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() 以追加模式打开。