简体   繁体   中英

How can I seekg() files over 4GB on Windows?

I am on Windows 7, 64bit and NTFS. I am building a DLL that must be 32 bit. I have a very simple routine that I'd like to implement in C++. I'm reading a large file using:

unsigned long p;
ifstream source(file);
streampos pp(p);
source.seekg(pp);

For files over 4GB I tried using unsigned long long but it's not working. What am I doing wrong? I'm using GNU GCC, would it be of any use trying MSVC Express 2008/2010?

Update:

There seems that something is wrong with my GCC. Right now I'm testing your proposals using MSVC and it seems that is working. MSVC uses an _int64 to represent streampos/streamoff objects, I will check later with GCC.

If you are running on a 32 bit system you are probably out of luck doing it the simple way although the streams library is free to use a 64 bit word for its pos_type . However, it might work to use relative seeks. Since all seeks return a pos_type which supposedly indicates the current position, this still might not work too well.

I guess it is just me but I never found seeking to be too useful anyway. Of course, having implemented this mess I'm also aware that seeking is bound to kill performance and that it only really works when using files opened in std::ios_base::binary mode which use no code conversion.

You may have to use a number of relative seeks instead, ie use the two-argument overload of seekg .

// Start with seeking from the beginning
source.seekg(some_pos, std::ios::beg);

// Then seek some more from that position
source.seekg(some_offset, std::ios::cur);

我相信您必须使用本地Win32调用来做到这一点,例如SetFilePointerEx http://msdn.microsoft.com/zh-cn/library/aa365542(VS.85).aspx

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM