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);
}
这是我正在尝试计算的代码。
- 写的很好,我只需要将它变成一个单独的函数来接收指向数据结构的指针及其大小。
- 但读取已关闭...读取并打印到控制台后,t_int 显示了一个非常大的数字,t_float 什么都没有,因此 char 和 string.. .
此外,我知道它不是写得最好、最高效和最安全的代码,但它只是一个原型,我想到的东西...
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);
作为大学作业的一部分,我正在尝试做一个简单的 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);
}
这是我正在尝试计算的代码。
- 写的很好,我只需要将它变成一个单独的函数来接收指向数据结构的指针及其大小。
- 但读取已关闭...读取并打印到控制台后,t_int 显示了一个非常大的数字,t_float 什么都没有,因此 char 和 string.. .
此外,我知道它不是写得最好、最高效和最安全的代码,但它只是一个原型,我想到的东西...
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);