我试着用一个数组把简单的结构写进一个文件,然后读取它。它适用于小于25的小数组,但由于某些原因,之后的所有数据都没有初始化;

typedef struct TestStruct {
    int data[30];
} TestStruct;



TestStruct *test = malloc(sizeof(TestStruct));
for (int i = 0; i < 30; i++)
{
    test->data[i] = i;
}
const char *filename = "some.txt";
FILE *file = fopen(filename, "w+");
fwrite(test, sizeof(TestStruct), 1, file);
rewind(file);
TestStruct *test2 = malloc(sizeof(TestStruct));
int rc = fread(test2, sizeof(TestStruct), 1, file);

这段代码的结果是rc = 0并且索引25之后的整数由于某种原因没有初始化。有人能解释问题出在哪里吗?

最佳答案

你在windows或dos平台上工作。
你用的是二进制数据。
将control-z写入文件(索引26处的字节码26)。
因为您没有在与b一起使用的模式字符串中指定fopen()(对于二进制),所以当您读取数据时,control-z被视为eof标记。
解决方法:使用"w+b"而不仅仅是"w+"来处理问题。
注意,从rc = 0返回的值fread()意味着读取无法读取请求的整个结构(因为在检测到eof之前只读取了26个字节,值为0..25)。它尽力让你知道有问题。
您还应该查看fwrite()中的返回值,以确保您希望编写的所有内容都是实际编写的。

09-25 21:16