【问题标题】:Issue with fwrite and fread in sequence依次出现 fwrite 和 fread 问题
【发布时间】:2019-05-30 15:26:09
【问题描述】:

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

【问题讨论】:

    标签: c windows io


    【解决方案1】:
    • 您在 Windows 或 DOS 平台上工作。
    • 您使用的是二进制数据。
    • 您将 control-Z 写入文件(索引 26 处的字节代码 26)。
    • 因为您没有在与fopen() 一起使用的模式字符串中指定b(用于二进制),所以当您读取数据时,control-Z 将被视为 EOF 标记。

    修复:使用"w+b" 而不是仅仅"w+" 来处理问题。

    请注意,fread() 的返回值 rc = 0 表示读取未能读取请求的整个结构(因为在检测到 EOF 之前仅读取了 26 个字节,值 0..25)。它已尽最大努力让您知道存在问题。

    您还应该查看来自fwrite() 的返回值,以确保您希望写入的所有内容实际上都已写入。

    【讨论】:

    • 还要注意,CRT 在文本模式下进行换行翻译。在文件中写入"\n" 会转换为"\r\n",读取"\r\n" 会转换回"\n"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    相关资源
    最近更新 更多