【问题标题】:read a binary file opened by fopen("ab") (add,binary)读取 fopen("ab") (add,binary) 打开的二进制文件
【发布时间】:2023-03-19 20:53:01
【问题描述】:

我只是在学习与FILEs 合作。我的问题是这样的: 当我想读取由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",因为它是关于保存游戏信息的,它不应该在关闭程序后删除或再次运行。

【问题讨论】:

  • 使用可以显示二进制内容的编辑器。
  • @user3121023 我试过删除文件上最后保存的数据
  • heeyyyy 为什么反对票!!!我只是一个可怜的工程师学生
  • 如果我将第一个程序更改为使用"ab" 而不是"wb",第二个程序仍然可以正确读取它。究竟是什么问题?您应该发布有问题的代码,而不是工作代码。
  • 我不明白为什么这行不通——它不是最好的设计,但至少应该可以。

标签: c++ c file binary


【解决方案1】:

您的问题最可能的原因是使用"ab" 打开文件不会截断它,因此您要附加到同一个文件并继续读取首先写入那里的任何不正确的输出。

另外,你的代码有几个问题:

  • 切勿使用gets()。它已从 C 标准中删除,因为无法告知缓冲区有多大,因此无法安全使用。
  • 您对文件结尾的测试不正确:永远不要使用feof(),因为它不会像您认为的那样做。它只能告诉您实际上试图读取文件的流函数是否遇到文件结尾。您可以简单地测试来自fread 的返回值。
  • main 的原型是 int main(void)int main(int argc, char *argv[])
  • 您应该检查边界是否正确,以防止读取超出str2 数组的末尾。

这是一个更正的版本:

#include <stdio.h>

int main(void) {
    char str2[100][400];
    FILE *load = fopen("save.dat", "rb");
    if (!load) {
        printf("cant open file!\n");
        return 1;
    }
    for (int i = 0; i < 100 && fread(str2[i], sizeof(char), 40, load) == 40; i++) {
        puts(str2[i]);
        printf("\n");
    }
    fclose(load);
    return 0;
}

【讨论】:

  • tnx 为您提供更正和帮助,它非常有帮助,我尝试了您的新代码,但它再次无法正常工作同样的问题@chqrlie
  • @AliZeynali:您是否首先删除了save.dat 文件?
  • 我没有删除而是删除了所有数据chqrlie
  • @AliZeynali:删除所有数据是什么意思?你是用del save.datrm save.datunlink("dave.dat"); 删除文件还是你做了别的什么?
  • 我刚刚打开文件并删除了文件中的所有内容并保存我没有删除文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多