rap*_*102 3 c file function fread
假设我有一个大小为 5000 字节的文件,我正在尝试读取该文件。
我有这个代码:
int main()
{
char *file_path[] = "/path/to/my/file"
FILE *fp= fopen(file_path,"rb"); //open the file
fseek(fp, 0, SEEK_END); // seek to end of file
unsigned long fullsize = ftell(fp); //get the file size (5000 for this example)
fseek(fp, 0, SEEK_SET); //bring back the stream to the begging
char *buf = (char*)malloc(5000);
fread(buf,5000,1,fp);
free(buf);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我也可以将fread呼叫替换为
fread(buf,1000,5,fp);
Run Code Online (Sandbox Code Playgroud)
什么是更好的?为什么?在优化方面,我理解返回值是不同的。
如果交换这两个参数,您仍然请求读取相同数量的字节。然而,行为在其他方面有所不同:
由于您应该始终检查 的返回值fread,因此这一点很重要:)
如果您使用 形式result = fread(buf, 1, 5000, fp);,即读取5000大小单位1,但文件大小仅为3000,那么会发生的情况是这些3000字节被放置在您的缓冲区中,并被3000返回。
换句话说,您可以检测到部分读取并仍然使用部分结果。
但是,如果您使用result = fread(buf, 5000, 1, fp);,即读取1大小单位5000,则缓冲区的内容是不确定的(即与未初始化变量的状态相同),并且返回值为0。
fseek在这两种情况下,部分读取都会使文件指针处于不确定状态,即在进行任何进一步的读取之前您需要这样做。
使用后一种形式(即除 之外的任何大小1)可能最适合当您想要在完整大小不可用时中止,或者您正在读取具有固定大小记录的文件时。