作为大学作业的一部分,我试图做一个简单的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);
}
这是我要尝试的代码。
另外,我知道它不是最好的编写,最有效和最安全的代码,但这只是一个原型,我想到的是这些东西……
答案 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);