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():如果您使用这些函数,就可以避免进行不必要的磁盘访问。文件大小只是内存中保存的文件的一部分元数据。