Tôi thấy rằng trong VS2010, hàm seekg không hoạt động đúng khi tệp chính xác là 4294967295 byte được mở.seekg không thể xử lý tệp của 4294967295 byte đúng
Tôi đang sử dụng mã đơn giản:
#include <iostream>
#include <fstream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
std::ifstream file;
// cmd: fsutil file createnew tmp.txt 4294967295
file.open(L"c:/tmp.txt", ifstream::in | ifstream::binary);
if(!file.is_open())
return -1;
file.seekg(0, std::ios::end);
auto state = file.rdstate();
// this condition shoots only when size of the file is equal to 4294967295
if((state & ifstream::failbit)==ifstream::failbit)
{
std::cout << "seekg failed";
}
// after seekg failed, tellg returns 0
std::streampos endPos = file.tellg();
return 0;
}
Cùng mã với các file của 4294967294 và 4294967296 đang làm việc mà không cần bất kỳ vấn đề.
Có ai đó biết giải pháp cho vấn đề này không?
Cập nhật:
Dường như vấn đề nằm ở đây:
template<class _Statetype>
class fpos
{
__CLR_OR_THIS_CALL operator streamoff() const
{ // return offset
return ((streamoff)(_Myoff + _FPOSOFF(_Fpos)));
}
}
chính xác tại
_FPOSOFF(_Fpos)
nơi
#define _FPOSOFF(fp) ((long)(fp))
Vì vậy, phải mất 4294967295 và chuyển đổi nó thành -1!
Nói cách khác nói, mã như vậy sẽ thất bại
//returns -1, even if sizeof(fpos_t)=8
fpos_t pos = _FPOSOFF(4294967295);
_Myoff, _Fpos, streamoffset là 64bit
Tại sao họ làm chuyển đổi này nếu tất cả các loại là 64 bit !? Tôi không có ý tưởng))
Lưu ý: 4294967295 là 0xffffffff. Có lẽ một số mã 32 bit ở đâu đó đang phá vỡ. – ecatmur
Cho rằng 4294967295 là mẫu bit giống như -1, nó sẽ không làm tôi ngạc nhiên nếu đây là một lỗi trong thời gian chạy. Tôi sợ tôi không có một workaround để cung cấp mặc dù ... – NPE
Đây là một lỗi và được cố định trong Visual Studio 2012: '_FPOSOFF' bây giờ phôi thành' long long' và do đó tránh cắt ngắn. –