使用C中的void指针读取/写入文件

时间:2018-06-28 02:48:24

标签: c pointers fwrite

作为大学作业的一部分,我试图做一个简单的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没有任何内容,因此char和string ...

另外,我知道它不是最好的编写,最有效和最安全的代码,但这只是一个原型,我想到的是这些东西……

3 个答案:

答案 0 :(得分:0)

  

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

答案 1 :(得分:0)

您的问题是,您正在用&dB.data而不是fwrite本身(它已经是一个指针)来写{em> dB.data地址。例如:

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

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

答案 2 :(得分:0)

您的错误位于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);