fread 后字符数组的长度小于预期

Length of character array after fread is smaller than expected

我正在尝试将文件读入字符数组,但是当我尝试为 MAXBYTES 传递 100 的值时(参数是 FUNCTION FILENAME MAXBYTES),字符串数组的长度为 7。

 FILE * fin = fopen(argv[1], "r");
    if (fin == NULL) {                                                                                 
      printf("Error opening file \"%s\"\n", argv[1]);
      return EXIT_SUCCESS;
    }
    int readSize;

    //get file size
    fseek(fin, 0L, SEEK_END);
    int fileSize = ftell(fin);
    fseek(fin, 0L, SEEK_SET);
    if (argc < 3) {
      readSize = fileSize;
    } else {
      readSize = atof(argv[2]);
    }

    char *p = malloc(fileSize);     

    fread(p, 1, readSize, fin);
    int length = strlen(p);
    filedump(p, length);

如您所见,p 的内存分配始终等于文件大小。当我使用 fread 时,我试图读入 100 个字节(readSize 应该设置为 100)并将它们存储在 p 中。但是,如果我传入该参数,则 strlen(p) 结果为 7。我是用错了 fread 还是有其他问题?

谢谢

这是尝试使用 fread 阅读文本的限制。这样做没有错,但你必须知道文件中是否包含 ASCII 字符以外的内容(例如 nul-character),你当然不能对文件的任何部分进行处理缓冲为 string 直到你在某个时候手动 nul-terminate 它。

fread 根本不保证缓冲区将包含 nul-terminating 字符——并且它不保证读取的第一个字符将不是 nul-character.

同样,将整个文件读入分配的缓冲区并没有错。这很常见,您只是不能将阅读的内容视为 string。这就是为什么有面向字符格式化面向行输入函数的进一步原因。 (getcharfgetcfscanffgets 和 POSIX getline,仅举几例)。 formattedline oriented 函数保证 nul-terminated 缓冲区,否则,你是自己解释你所阅读的内容,并确保你 nul-terminate 你的缓冲区 - 在将其视为字符串之前。