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

标签 c arrays pointers malloc fread

我正在尝试将文件读入字符数组,但是当我尝试传入 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),并且你当然不能将缓冲区的任何部分视为 字符串,直到您在某个时刻手动终止它。

fread 不保证缓冲区将包含一个 nul-termination 字符——并且它不保证读取的第一个字符不是 < em>空字符。

同样,将整个文件读入分配的缓冲区没有任何问题。这很常见,你只是不能将你读到的内容视为字符串。这就是为什么存在面向字符格式化面向行输入函数的另一个原因。 (getcharfgetcfscanffgets 和 POSIX getline,列出很少)。 格式化面向行函数保证nul终止缓冲区,否则,您将自行负责您所读取的内容,并且确保在将缓冲区视为字符串之前将其终止。

关于c - fread 后的字符数组长度小于预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48940164/

相关文章:

C 使用指针比较数组元素

C 代码给出不同的输出

C++下载多个文件

Java:使用数组洗牌

php - 使用 PHP 和 Mysql Foreach 循环创建多维数组

Javascript - 计算具有值的数组对象

c++ - 通过指针后结果的变化

c++ - 在堆上声明对象然后通过引用传递它?

c - 在linux上为C程序制作makefile

c++ - 乘法比浮点除法快吗?