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

佐手、 提交于 2020-01-04 13:28:52

问题


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.


回答1:


You may have to use a number of relative seeks instead, i.e. 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);



回答2:


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.




回答3:


I believe you'll have to use native Win32 calls to do this like SetFilePointerEx http://msdn.microsoft.com/en-us/library/aa365542(VS.85).aspx



来源:https://stackoverflow.com/questions/9405712/how-can-i-seekg-files-over-4gb-on-windows

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!