Как читать, изменять структуры из нетекстового файла? - PullRequest
0 голосов
/ 30 октября 2018

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

Я не получаю никакой ошибки, только последние сохраненные структуры, но в файле я вижу их все, если открываю с помощью текстового редактора.

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <string.h>
#include <time.h>

#define MAX_STRING_LEN 80
#define PHONE_NUMBER 15

struct order {
    time_t   systime;
    char     name[MAX_STRING_LEN];
    char     email[MAX_STRING_LEN];
    int      phonenumber;
    int      size;
};


//functions
void saveToFiles(struct order *current);
void dbList(struct order *current);

//save into file
void saveToFiles(struct order *current) {
    FILE * file=fopen("db.txt", "a");
    if(file != NULL) {
        fwrite(current, sizeof(struct order), 1, file);
        //      fwrite("\n", sizeof("\n"), 1, file);   //If I broke the line then all of the reading get some numbers, without any meaning
        fclose(file);
    }
}

//list the db
void dbList(struct order *current) {
    int option;
    printf("list: \n    1 - ful list\n    2 - just names\n    3 - just size\n    0 - exit");
    scanf(" %i", &option);
    if(option == 0) {
        exit(1);
    }
    if(option == 1) {
        //loadList(1);
        struct order *obj=malloc(sizeof(struct order));
        FILE * file = fopen("db.txt","rb");
        fseek(file, 0, SEEK_SET);  //I tried to put the file read at the begining of the file
        while(fread(obj, sizeof(struct order), 1, file)) {
            printf("LOG: op1\n");
            fread(obj, sizeof(struct order), 1, file);
            printf("%s/%s/%d/%d\n", obj->name, obj->email, obj->phonenumber, obj->size);
        }
        if(feof(file)) {
            printf("\n--END--\n");
        }
        else {
            printf("Some error...");
        }
    }
}

//***

int main(k)
{
    struct order current;   //struct init
    //    current = malloc(sizof(*current));

    int option = 1;
    while(option != 0) {
        printf(" " "\x1B[34m");
        printf("0 exit \n 1 new \n 2 list \n \n " "\x1B[0m");
        scanf(" %i", &option);
        if(option == 1) {
            getNewOrder(&current);
        }
        if(option == 2) {
            dbList(&current);
        }
    }
    return 0;
}

1 Ответ

0 голосов
/ 31 октября 2018

Для записи файла, пожалуйста, проверьте, может ли fseek () выполнить SEEK_END, а затем выполнить fwrite.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...