使用fread()

时间:2016-12-07 21:08:18

标签: c

这是一个最小的“工作”示例:

#include <stdio.h>
#include <stdlib.h>

int main (int argc, char* argv[])
{
    int num = 10;

    FILE* fp = fopen("test.txt", "r");     // test.txt contains character sequence

    char* ptr = (char*) malloc(sizeof (char)*(num+1));  // +1 for '\0'

    fread(ptr, sizeof(char), num, fp);      // read bytes from file
    ptr[num] = '\0';

    printf("%s\n", ptr);        // output: ´╗┐abcdefg

    free(ptr);
    fclose(fp);

    return 0;
}

我想从文本文件中读取一些字母,其中包含字母表中的所有字母。我希望我的数组存储前10个字母,但输出中显示的前3个是奇怪的符号(请参阅printf语句中的注释)。

我做错了什么?

1 个答案:

答案 0 :(得分:3)

问题是您的文件是使用UTF-8编码的。虽然UTF-8向后兼容ASCII(这是您的代码将使用的),但存在许多差异。

特别是,许多程序会在文件的开头放置BOM(字节顺序标记)符号,以指示字节的方向。如果使用默认的Windows代码页打印BOM,则会得到您看到的两个符号。

您用于创建文本文件的任何程序都会自动在文件开头插入该BOM。 Notepad ++因此而臭名昭着。检查保存选项并确保将其保存为纯ASCII或不带BOM的UTF-8。这将解决您的问题。