fwrite和fread顺序出现问题

时间:2019-01-04 02:34:23

标签: c windows io

我正在尝试将带有数组的简单结构写入文件,然后读取它。它适用于小于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之后的整数未初始化。谁能解释问题出在哪里?

1 个答案:

答案 0 :(得分:3)

  • 您正在Windows或DOS平台上工作。
  • 您正在使用二进制数据。
  • 您将control-Z写入文件(索引26处的字节码26)。
  • 由于未在与import pandas as pd dfz = pd.read_csv('control.csv', index_col=0, parse_dates=True) df1 = pd.DataFrame(dfz[0]) print(dfz['Unnamed: 1']) dfz['Unnamed: 1'].replace('-','') 一起使用的模式字符串中指定b(对于二进制),因此在读取数据时,control-Z被视为EOF标记。

修复:使用fopen()而不是"w+b"来解决问题。

请注意,"w+"的返回值rc = 0表示读取未能读取所请求的整个结构(因为在检测到EOF之前仅读取了26个字节,值0..25)。尽力告诉您有问题。

您还应该查看fread()的返回值,以确保您实际上要编写的所有内容都已编写。