在 c 中确定用于缓冲区分配的文件大小
determine size of file for buffer allocation in c
我写的这段代码应该是遍历
一个文件并在每次运行时增加大小计数器 +1
字符:
while (fgetc(input) != EOF)
size++;
if (feof(input)) {
buff = (char *)malloc(sizeof(char) * size + 1);
}
当未到达文件末尾时,大小正在递增。如果 EOF-> feof==true
和缓冲区大小
可以确定。
只是想知道这样做是否可行,或者是否有更好的方法。
假设size
在循环之前初始化为0
并且input
在流的开头,循环将正确地确定可以从中读取的字节数文件。
在循环区分文件结束和读取错误条件后测试 feof()
。通常不需要做这个区分,所以可以去掉这个测试。
malloc(sizeof(char) * size + 1)
分配正确的字节数以将文件作为 C 字符串读取,但表达式不正确:它应该是 sizeof(char) * (size + 1)
或只是 size + 1
as sizeof(char)
根据定义是 1
。
请注意,您需要明确设置空终止符,因为 malloc()
不会初始化它分配的块。
另请注意,某些流(例如终端)可能无法搜索,因此如果您需要倒带流以读取字节,此方法可能会失败。
最后请注意,size
可能小于遗留系统上的文件长度,遗留系统使用 2 个字节作为行尾标记,例如 MS/DOS 和 Windows。
使用ftell()函数大小可以确定,如
fseek( input, 0, SEEK_END );
size = ftell( input);
然后设置指向文件开头的指针,
fseek( input, 0, SEEK_SET );
我写的这段代码应该是遍历
一个文件并在每次运行时增加大小计数器 +1
字符:
while (fgetc(input) != EOF)
size++;
if (feof(input)) {
buff = (char *)malloc(sizeof(char) * size + 1);
}
当未到达文件末尾时,大小正在递增。如果 EOF-> feof==true
和缓冲区大小
可以确定。
只是想知道这样做是否可行,或者是否有更好的方法。
假设size
在循环之前初始化为0
并且input
在流的开头,循环将正确地确定可以从中读取的字节数文件。
在循环区分文件结束和读取错误条件后测试 feof()
。通常不需要做这个区分,所以可以去掉这个测试。
malloc(sizeof(char) * size + 1)
分配正确的字节数以将文件作为 C 字符串读取,但表达式不正确:它应该是 sizeof(char) * (size + 1)
或只是 size + 1
as sizeof(char)
根据定义是 1
。
请注意,您需要明确设置空终止符,因为 malloc()
不会初始化它分配的块。
另请注意,某些流(例如终端)可能无法搜索,因此如果您需要倒带流以读取字节,此方法可能会失败。
最后请注意,size
可能小于遗留系统上的文件长度,遗留系统使用 2 个字节作为行尾标记,例如 MS/DOS 和 Windows。
使用ftell()函数大小可以确定,如
fseek( input, 0, SEEK_END );
size = ftell( input);
然后设置指向文件开头的指针,
fseek( input, 0, SEEK_SET );