1

I'm just starting to learn files. For this eI'm trying to create a program that keeps track of transaction records in a store. The first step is to record a day's transactions. I create a file trans.c that I can have open alongside my main.c file, so as to keep track of it. I then fill in trans.c first with empty structs to allocate memory for the transaction records, then I fill it in with structs containing client data using 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);
    }
}

When I go back to trans.c to see if it had worked, the file remains empty, and yet my code compiles without issue, and in run time I don't seem to have trouble filling in the structs and writing them in. Is the file being filled in elsewhere, or am I missing something/doing this wrong?

3
  • The changes from fillTrans() are probably being lost because you haven't closed the file before you call it. Commented Jul 2, 2015 at 20:52
  • I dont think that'd be it seeing as C automatically closes files at the end of the function if they haven't been closed manually, to save memory. Commented Jul 2, 2015 at 21:14
  • At the end of the program, not the end of the function. And main() hasn't ended yet when you call fillTrans(). Commented Jul 2, 2015 at 21:18

1 Answer 1

1

You're opening "trans.c" in main, then calling fillTrans() without closing it first -- so you have the file open twice while you write the data in fillTrans(). If the setup you're running this on allows both opens to succeed (on some, file locking would prevent it), then likely the last one to close determines the final contents of the file. Since main() doesn't close it (so its copy closes when the program ends), you end up with whatever main() had put in the file and discard what fillTrans() wrote through the second FILE *.

It may be possible to end up with some of the writes from fillTrans() in the file (if it weren't appending), but the file size would still be fixed by what main() had, and which parts of the file would have whose data is not easily predictable.

Also, if the writes from fillTrans() did remain, they would have been added to the end of the file, after anything main() wrote that had been flushed to disk already (if any), because fillTrans() opens in append mode.

Sign up to request clarification or add additional context in comments.

1 Comment

closing ftrans before opening it again in fillTrans did the trick, thanks!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.