Чтение / запись в файл с использованием пустых указателей в C - PullRequest
0 голосов
/ 28 июня 2018

В рамках задания колледжа я пытаюсь создать простое приложение на C, использующее Win32 для программирования GUI и пишущий собственный динамический связанный список для хранения данных. Поскольку позже я мог бы использовать его для других целей, я пытаюсь написать общий список со «встроенными» функциями для чтения и записи данных в файл. Теперь вот моя проблема

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>

 typedef struct tagA{
     int t_int;
     float t_float;
     char t_char;
     char t_vchar[30];
 } A;

 typedef struct tagB{
     void *data;
     struct tagB *prox;
 } B;

 int main(){
     A dA = {1, 1.5, 'a', "teste123"};
     B dB = {&dA, NULL};
     dB.data = &dA;
     B dB2 = {0};

     FILE *fp;
     fp = fopen("Data.txt", "w");

     size_t dSize = sizeof(dA);
     printf("Struct size: %d", dSize);

     if(fp == NULL){
         printf("nope");
     }else{
         fwrite(&dB.data, dSize, 1, fp);
     }
     fclose(fp);
     fp = fopen("Data.txt", "r");

     dB2.data = malloc(dSize);
     fread(&dB2.data, dSize, 1, fp);

     printf("\n\n%s", ((A*)dB2.data)->t_vchar);
 }

Это код, который я пытаюсь проработать.

  • Запись работает просто отлично, и мне просто нужно сделать это для отдельной функции, которая получает указатель на структуру данных и ее размер.
  • Но чтение отключено ... После чтения и вывода на консоль t_int показывает действительно большое число, у t_float ничего нет, и поэтому символ и строка ...

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

Ответы [ 3 ]

0 голосов
/ 28 июня 2018

Ваша проблема в том, что вы пишете адрес &dB.data с fwrite вместо dB.data (это уже указатель). Например:

fwrite(dB.data, dSize, 1, fp);

разрешит вашу проблему (с соответствующим изменением на fread).

0 голосов
/ 28 июня 2018

Ваша ошибка на fwrite(), fread(). Первым параметром из них является указатель, который указывает на реальные данные, которые вы хотите записать / прочитать. Поскольку вы хотите читать / записывать struct A, указатель должен фактически указывать на struct A, а не struct A*.

Просто замените

fwrite(&dB.data, dSize, 1, fp);
fread(&dB2.data, dSize, 1, fp);

с

fwrite(dB.data, dSize, 1, fp);
fread(dB2.data, dSize, 1, fp);
0 голосов
/ 28 июня 2018

void *data;

Бесполезно объявлять data как void*. Объявите его как A *data;.

fwrite(&dB.data, dSize, 1, fp);
...
fread(&dB2.data, dSize, 1, fp);

dB2.data - указатель, просто используйте dB2.data. Смотрите пример ниже. Для лучшей читаемости вы можете объявить ptr_data вместо data

typedef struct tagA {
    int t_int;
    float t_float;
    char t_char;
    char t_vchar[30];
} A;

typedef struct tagB {
    A *data;
    struct tagB *prox;
} B;

int main() {
    A dA = { 1, 1.5, 'a', "teste123" };
    B dB = { 0 };
    dB.data = &dA;
    B dB2 = { 0 };

    FILE *fp;
    fp = fopen("Data.txt", "w");

    size_t dSize = sizeof(dA);
    printf("Struct size: %d", dSize);

    if(fp == NULL) {
        printf("nope");
    }
    else {
        fwrite(dB.data, dSize, 1, fp);
    }
    fclose(fp);
    fp = fopen("Data.txt", "r");

    dB2.data = malloc(dSize);
    fread(dB2.data, dSize, 1, fp);

    printf("\n\n%s\n", dB2.data->t_vchar);

    return 0;
}
...