Read/Write 在 C 中使用 void 指针进行归档

Read/Write to file using void pointers in C

作为大学作业的一部分,我正在尝试做一个简单的 C 应用程序,使用 Win32 进行 GUI 编程并编写我自己的动态链表来存储数据。因为我以后可以将它用于其他事情,所以我正在尝试编写一个通用列表,其中包含 "built in" 用于读取数据和将数据写入文件的函数。现在这是我的问题

 #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);
 }

这是我正在尝试计算的代码。

此外,我知道它不是写得最好、最高效和最安全的代码,但它只是一个原型,我想到的东西...

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;
}

你的问题是你正在用fwrite而不是dB.data本身写&dB.data地址(它已经是一个指针) .例如:

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

将解决您的问题(对 fread 进行类似的相应更改)。

您的错误位于 fwrite()fread()。它们的第一个参数是指向你想要的真实数据的指针write/read。 因为你想 read/write 一个 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);