gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:50:33 25 4
gpt4 key购买 nike

我正在尝试将文件读入字符数组,但是当我尝试传入 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com