C 在Windows中获取文件大小并设置查找指针
我正在尝试使用以下方法获取此大小的文件:C 在Windows中获取文件大小并设置查找指针,c,windows,file,file-io,C,Windows,File,File Io,我正在尝试使用以下方法获取此大小的文件: size_t fsize = 0; fseek(fin, 0L, SEEK_END); fsize = ftell(fin); fseek(fin, 0L, SEEK_SET); 所讨论的文件有点超过2GiB,ftell返回一些巨大的数字 我的应用程序还要求在每次读取后将seek指针设置回若干字节。我用了下面的方法 i = fread(inbuf, 1,readSize, fin); fseek(fin, -16, SEEK_CUR); 每次读取后
size_t fsize = 0;
fseek(fin, 0L, SEEK_END);
fsize = ftell(fin);
fseek(fin, 0L, SEEK_SET);
所讨论的文件有点超过2GiB,ftell返回一些巨大的数字
我的应用程序还要求在每次读取后将seek指针设置回若干字节。我用了下面的方法
i = fread(inbuf, 1,readSize, fin);
fseek(fin, -16, SEEK_CUR);
每次读取后,我检查I
是否等于16,如果我在最后一次读取后到达文件末尾,通常会出现这种情况。但是,这也不起作用,并且将零值分配给i
,表示搜索指针没有向后移动
我应该注意到,我的程序在Linux中运行得很好,并且已经用不同的读取和文件大小进行了测试。该代码与Linux版本的代码几乎相同。区别在于我无法在Windows中使用C99中的stdint
库。除此之外,代码完全相同。Linux版本使用完全相同的测试文件和读取大小就可以正常工作
最后,我应该提到,这是一个CUDA程序(运行时版本4.2),在Win7上使用VS2010。这是一个64位程序
编辑
此文件是使用“b”标志打开的。代码如下:
if(!(fin = fopen(argv[1], "rb")))
{
printf("The input file: %s could not be opened\n", argv[1]);
err = -5; goto exit;
}
if(!(fout = fopen(argv[2], "wb")))
{
printf("The output file: %s could not be opened\n", argv[1]);
err = -6; goto exit;
}
用二进制文件打开文件(使用
O_binary
)可能会有所帮助。否则,可能会出现libne中断和EOF字符问题。fstat()可用于获取文件大小。这比读取文件来计算大小要好
编辑:
不过,我不太确定fstat在Windows上的行为 由于OP使用的是
文件
,很可能是fopen
,因此模式字符串应该包含“b”
,这与@JoachimPileborg所说的相同。我使用的是fopen,但是文件已经用“b”
标志打开了。我已经更新了这个问题。这可能有效,但这需要使用文件句柄而不是标准的文件指针。有没有办法从另一个文件中获取一个文件描述符。使用fileno
函数从文件中获取文件描述符*
:看来应该行得通。只需详细介绍一下stat()系统调用或fstat():如果您使用这些函数,就可以避免进行不必要的磁盘访问。文件大小只是内存中保存的文件的一部分元数据。