读取二进制和txt文件 - 一次1个字节

时间:2015-08-18 21:27:38

标签: c io binaryfiles file-handling fgetc

我正在尝试编写一个读取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; 
}

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

您还要在" text"中打开文件。模式:

If 'cancel' or 'x' then
    .......
End If

根据C Standard, section 7.19.2

  

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

使用fp = fopen("TestFile3.txt", "r"); 不会返回文本流中可读的字节数。

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

fseek()/ftell()

最后,使用fp = fopen("TestFile3.txt", "rb"); 对二进制文件也不可靠,因为,再次按照C标准,7.19.9.2:

  

二进制流不需要有意义地支持fseek调用   SEEK_END的价值

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

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