首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >读取由fopen("ab")打开的二进制文件(添加,二进制)

读取由fopen("ab")打开的二进制文件(添加,二进制)
EN

Stack Overflow用户
提问于 2016-01-21 21:13:07
回答 1查看 2.9K关注 0票数 2

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

这张照片

但是当我用fopen("example.dat", "wb")打开文件时,它就能工作了!

以下是我的测试程序:

要在文件中写入:

代码语言:javascript
运行
复制
#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++;
    }
}

改为:

代码语言:javascript
运行
复制
#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",因为它是关于保存一个游戏的信息,它不应该删除关闭程序或再次运行它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-21 21:34:16

最有可能导致问题的原因是使用"ab"打开文件并不会截断它,因此您将附加到同一个文件中,并继续读取任何不正确的输出。

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

  • 永远不要使用gets()。它被从C标准中删除,因为不能告诉它缓冲区有多大,因此不能安全地使用。
  • 您对文件结束的测试是不正确的:永远不要使用feof(),因为它没有执行您认为它所做的事情。它只能告诉您是否遇到了流函数所遇到的文件结束,该流函数实际上试图通过它读取文件。您可以简单地测试来自fread的返回值。
  • main的原型要么是int main(void) of int main(int argc, char *argv[])
  • 您应该检查是否有正确的边界,以防止在str2数组结束后读取。

以下是修正后的版本:

代码语言:javascript
运行
复制
#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;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34934450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档