【发布时间】:2020-07-26 14:13:42
【问题描述】:
我目前正在尝试使用 C 的 fread 函数在 Windows 上读取文件的全部内容。此函数需要将正在读入的缓冲区的大小作为参数传递。因为我想读取整个文件,所以我需要以字节为单位传递文件的大小。
我尝试通过使用 Win32 API 来获取 Windows 上文件的大小,更具体地说,使用 GetFileSizeEx。下面的 sn-p 来自an existing Stack Overflow answer。
__int64 GetFileSize(const char* name)
{
HANDLE hFile = CreateFile(name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile == INVALID_HANDLE_VALUE)
return -1; // error condition, could call GetLastError to find out more
LARGE_INTEGER size;
if(!GetFileSizeEx(hFile, &size))
{
CloseHandle(hFile);
return -1; // error condition, could call GetLastError to find out more
}
CloseHandle(hFile);
return size.QuadPart;
}
此函数返回的大小比实际文件大小大。执行以下代码块后
FILE* file = fopen(path, "r");
long size = (long)GetFileSize(path);
char* buffer = new char[size + 1];
fread(buffer, 1, size, file);
buffer[size] = '\0';
缓冲区的末尾包含垃圾字节。我已经手动检查过,返回的大小肯定比实际大小(以字节为单位)大。
我已经尝试了上面链接的同一个 Stack Overflow 答案中描述的其他方法,但它们都会在缓冲区末尾产生垃圾字节。
【问题讨论】:
-
generic C 你寻找到最后并获得文件位置是吗?
-
@old_timer 我也试过了,但这似乎不是标准的,而且它还返回比实际尺寸更大的尺寸。即使使用“r”和“rb”阅读模式。
-
GetFileSize 以及寻找到最后都应该为您提供准确的文件大小。您是如何确定“实际文件大小”的?也许那个方法是错误的。
-
你说“最后包含垃圾字节”。是从缓冲区读取垃圾还是垃圾?你检查了吗?此外
new char[size]是 C++,而不是 C。 -
文件大小的基准是多少?