我正在尝试将文件读入字符数组,但是当我尝试传入 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>空字符。
同样,将整个文件读入分配的缓冲区没有任何问题。这很常见,你只是不能将你读到的内容视为字符串。这就是为什么存在面向字符、格式化和面向行输入函数的另一个原因。 (getchar
、fgetc
、fscanf
、fgets
和 POSIX getline
,列出很少)。 格式化和面向行函数保证nul终止缓冲区,否则,您将自行负责您所读取的内容,并且确保在将缓冲区视为字符串之前将其终止。
关于c - fread 后的字符数组长度小于预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48940164/