Ich habe festgestellt, dass in SE2010, seekg Funktion nicht ordnungsgemäß funktioniert, wenn Datei von genau 4294967295 Bytes geöffnet ist.seekg kann nicht Datei von 4294967295 Bytes richtig behandeln
Ich bin mit einfachen Code:
#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;
}
Denselben Code mit Dateien von 4294967294 und 4294967296 ist ohne Probleme arbeiten.
Kennt jemand eine Lösung für dieses Problem?
Update:
Es ist wie dieses Problem sieht liegt hier:
template<class _Statetype>
class fpos
{
__CLR_OR_THIS_CALL operator streamoff() const
{ // return offset
return ((streamoff)(_Myoff + _FPOSOFF(_Fpos)));
}
}
genau an
_FPOSOFF(_Fpos)
wo
#define _FPOSOFF(fp) ((long)(fp))
Also dauert es 4294967295 und konvertiert es in -1!
Mit anderen Worten gesagt, wird ein solcher Code
//returns -1, even if sizeof(fpos_t)=8
fpos_t pos = _FPOSOFF(4294967295);
_Myoff, _Fpos scheitern, streamoffset 64bit sind
Warum sie diese Umwandlung, wenn alle Arten 64-Bit sind !? Ich habe keine Ahnung))
Hinweis: 4294967295 ist 0xffffffff. Wahrscheinlich gibt es irgendwo einen 32-Bit-Code, der kaputt geht. – ecatmur
Angesichts 4294967295 ist das gleiche Bitmuster wie -1, es würde mich nicht überraschen, wenn dies ein Fehler in der Laufzeit war. Ich habe Angst, dass ich keinen Workaround anbieten kann ... – NPE
Dies ist ein Fehler und wird in Visual Studio 2012 behoben: '_FPOSOFF' wird jetzt zu' long long' umgewandelt und vermeidet so die Kürzung. –