我试着用一个数组把简单的结构写进一个文件,然后读取它。它适用于小于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()
中的返回值,以确保您希望编写的所有内容都是实际编写的。