【问题标题】:Read binary and txt File - 1 byte at a time读取二进制和 txt 文件 - 一次 1 个字节
【发布时间】:2015-08-18 21:27:37
【问题描述】:

我正在尝试编写一个读取 1 个字节的代码(理想的目标是 n 个字节,但从 1 个字节开始 - 所以对于 n 个字节,如果它更容易请建议)

以下是我尝试一次读取 1 个字节并以十六进制格式输出的代码。但得到的只是一堆 FFFF

    FILE *fp;
    int stringlength,i;

    /* File can be txt or .bin */
    fp = fopen("TestFile3.txt", "r");
    if (fp == NULL) 
    {
        puts("Error: Input file cannot be read");
        return -1;
    }
    else 
    {
        size_t i, strlength, lengthOfFile,c;
        fseek(fp, 0, SEEK_END);
        lengthOfFile = ftell(fp);
        printf("length of File is ---- %d \n", lengthOfFile);
        while (lengthOfFile)
        {
            c = fgetc(fp);
            printf("%c", c);
            lengthOfFile--;
        }
        putchar('\n');

    }
    fclose(fp);
    return 0; 
}

【问题讨论】:

  • fseek(fp, 0, SEEK_END); - 你觉得这是在做什么?
  • 您已搜索到文件末尾,然后继续尝试阅读,这意味着您正在阅读的只是 EOF....
  • 已经跳转到文件末尾,你只会在读取更多数据时得到 EOF,不是吗?
  • 作为一种风格,当前一个代码块退出时,您不需要else
  • c 必须是intsize_t 是一个非常错误的类型。并阅读格式字符串语法和正确的参数。

标签: c io binaryfiles file-handling fgetc


【解决方案1】:

您需要fseek(fp, 0, SEEK_SET);while 循环之前重置文件指针。

【讨论】:

    【解决方案2】:

    您还以“文本”模式打开文件:

    fp = fopen("TestFile3.txt", "r");
    

    根据C Standard, section 7.19.2

    文本流是由字符组成的有序序列 行,每行由零个或多个字符加上一个 终止换行符。最后一行是否需要 终止换行符是实现定义的。人物 可能必须在输入和输出上添加、更改或删除 符合在宿主中表示文本的不同约定 环境。 因此,不需要一一对应 在流中的字符和外部字符之间 代表。

    使用fseek()/ftell() 不会返回可从文本流中读取的字节数。

    如果要读取文件大小的每个字节,则需要以二进制模式打开文件:

    fp = fopen("TestFile3.txt", "rb");
    

    最后,fseek()/ftell() 在二进制文件上的使用也不可靠,因为再次按照 C 标准 7.19.9.2:

    二进制流不需要有意义地支持 fseek 调用 SEEK_END 的值从何而来

    鉴于此,您也无法可靠地使用fseek()/ftell() 来找出二进制文件的大小。是的,确实存在示例。

    为了可靠地读取文件中的所有字节,@Weather Vane 在 cmets 中发布了一种方法。

    【讨论】:

      猜你喜欢
      • 2011-08-30
      • 1970-01-01
      • 2013-12-06
      • 2020-11-20
      • 2012-07-11
      • 2010-11-05
      • 1970-01-01
      • 2017-04-14
      • 1970-01-01
      相关资源
      最近更新 更多