2015-07-02 2 views
1

Я только начинаю изучать файлы. Для этого eI'm пытается создать программу, которая отслеживает записи транзакций в магазине. Первым шагом является запись дневных транзакций. Я создаю файл trans.c, который я могу открыть вместе с моим файлом main.c, чтобы отслеживать его. Затем я заполняю trans.c сначала пустыми структурами, чтобы выделить память для записей транзакций, а затем заполняю его структурами, содержащими данные клиента, используя fwrite.Написание структур в файл C

#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, чтобы увидеть, если он работал, файл остается пустым, и все же мой код компилируется без проблем, так и во время выполнения, я, кажется, не имею заполнение неприятности в структурирует и записывает их. Является ли файл заполненным в другом месте, или я чего-то не хватает/делаю это неправильно?

+0

Изменения из 'fillTrans()', вероятно, будут потеряны, потому что вы не закрыли файл до его вызова. – Dmitri

+0

Я не думаю, что если бы он увидел, что C автоматически закрывает файлы в конце функции, если они не были закрыты вручную, чтобы сохранить память. –

+0

В конце * программы *, а не в конце функции. И 'main()' еще не закончился, когда вы вызываете 'fillTrans()'. – Dmitri

ответ

1

Вы открываете «trans.c» в основном, а затем вызываете fillTrans(), не закрывая его первым - так что вы дважды открываете файл, когда записываете данные в fillTrans(). Если настройка, с которой вы запускаете это, позволяет обоим открытиям преуспеть (в некоторых случаях блокировка файлов предотвратит их), тогда, вероятно, последнее закрытие определяет окончательное содержимое файла. Поскольку main() не закрывает его (поэтому его копия закрывается, когда программа заканчивается), вы получаете то, что main() вложили в файл, и отбросьте то, что fillTrans() написал через второй FILE *.

Это может быть возможным, чтобы в конечном итоге с некоторые из записи из fillTrans() в файле (если это не добавление), но размер файла будет по-прежнему фиксируется, что main() было, и какие части файл, чьи данные нелегко предсказуемы.

Кроме того, если запись из fillTrans() же остаются, они были бы добавлены в конец файла, после того, как что-нибудь main() писал, что были сброшены на диск уже (если таковые имеются), потому что fillTrans() открывается в режиме добавления.

+0

закрытие ftrans перед тем, как открыть его снова в fillTrans, сделал трюк, спасибо! –

Смежные вопросы