读取由fopen(“ab”)打开的二进制文件(add,binary)

时间:2016-01-21 21:13:08

标签: c++ c file binary

我正在学习使用FILE。我的问题是: 当我想读取由fopen("example.dat", "ab")打开的二进制文件时,它显示如下内容:

this pic

但是当我按fopen("example.dat", "wb")打开文件时,它可以正常工作!

以下是我的测试程序:

写入文件:

#include <stdio.h>
void main() {
    int i = 0;
    FILE *save = fopen("save.dat", "wb");
    char str[5][40];
    while (i < 5) {
        gets(str[i]);
        fwrite(str[i], sizeof(char), 40, save);     
        i++;
    }
}

阅读:

#include <stdio.h>
void main() {
    char str2[100][400];
    int i = 0;
    FILE *load = fopen("save.dat", "rb");
    if (!load) {
        printf("cant open file!");
        return;
    }
    fread(str2[i], sizeof(char), 40, load);
    while (!feof(load)) {
        puts(str2[i]);
        printf("\n");
        i++;
        fread(str2[i], sizeof(char), 40, load);
    }
}

我需要"ab",因为它是关于保存游戏的信息,它不应该在关闭程序后删除或再次运行。

1 个答案:

答案 0 :(得分:2)

问题的最可能原因是使用"ab"打开文件不会截断它,因此您将附加到同一文件并继续读取首先写入的错误输出。

此外,您的代码有几个问题:

  • 永远不要使用gets()。它已从C标准中删除,因为无法告知缓冲区有多大,因此无法安全使用。
  • 您对文件结尾的测试不正确:永远不要使用feof(),因为它没有按照您的想法执行。它只能告诉您实际尝试读取它的流函数是否遇到了文件末尾。您只需测试fread
  • 的返回值即可
  • main的原型是[{1}}
  • int main(void)
  • 您应检查正确的边界,以防止读取int main(int argc, char *argv[])数组的末尾。

以下是更正后的版本:

str2