C++ tellg()返回否定答案

C++ tellg()返回否定答案,c++,file-io,C++,File Io,我以二进制模式打开了一个文件,执行下面的操作会得到负值x。我打开的文件大小约为2.5 GB infile.seekg(0, ios::end); __int64 x = infile.tellg(); 我需要infle读取字节(无符号字符),因此我通过以下操作将其定义为uifstream: typedef basic_ifstream<unsigned char, std::char_traits<unsigned char> > uifstream; typedef

我以二进制模式打开了一个文件,执行下面的操作会得到负值x。我打开的文件大小约为2.5 GB

infile.seekg(0, ios::end);
__int64 x = infile.tellg();
我需要
infle
读取字节(无符号字符),因此我通过以下操作将其定义为
uifstream

typedef basic_ifstream<unsigned char, std::char_traits<unsigned char> > uifstream;
typedef basic_ifstream uifstream;
它基本上是一个标准的ifstream,但是使用了
无符号字符
而不是
字符


编辑:我正在使用Visual Studio 2005并将uofstream更正为uifstream。

我已经在评论中提到了这一点,但我认为这也是答案:


VS2005中的STL不支持大于2147483647(~2GB)的偏移量,因此查找或告知超出该偏移量的位置不起作用,并将解释负值。(见附件)

(还有
tellg()
在出现错误时返回-1,但我假设您看到了其他负值)


解决方案是使用较新的编译器(VS2010)或使用替代STL实现,如

这里是一个与VS2010兼容的脏解决方案:

__int64 size = *(__int64*) ( ((char*)&(infile.tellg())) +8)

您是否使用输出流作为输入
seekg
tellg
仅存在于输入文件streams.oops中。。那是个打字错误。。。现在更正了…你是如何打开文件的?您使用了哪些选项?是否已正确打开?打开并查看后是否检查了内部状态标志?在此链接上找到了一些内容,但找不到任何解决方案。。。有一些关于2^31的限制。。。VS2005中的STL不支持大偏移,请参见: