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。这就是为什么有面向字符、格式化和面向行输入函数的进一步原因。 (getchar
、fgetc
、fscanf
、fgets
和 POSIX getline
,仅举几例)。 formatted 和 line oriented 函数保证 nul-terminated 缓冲区,否则,你是自己解释你所阅读的内容,并确保你 nul-terminate 你的缓冲区 - 在将其视为字符串之前。
我正在尝试将文件读入字符数组,但是当我尝试为 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。这就是为什么有面向字符、格式化和面向行输入函数的进一步原因。 (getchar
、fgetc
、fscanf
、fgets
和 POSIX getline
,仅举几例)。 formatted 和 line oriented 函数保证 nul-terminated 缓冲区,否则,你是自己解释你所阅读的内容,并确保你 nul-terminate 你的缓冲区 - 在将其视为字符串之前。