Avatar billede kjsksed Nybegynder
05. juni 2002 - 10:04 Der er 5 kommentarer og
1 løsning

skrive/læse > 2Gb filer

Hvordan læser og skriver jeg lettest filer over 2Gb ?

Findes der et compiler direktiv der muliggør seek og tell på filer over 2Gb i MSVC uden at man skal omskrive koden til at bruge _seeki64 og _telli64 ?

Findes der direktiv for do til stream i C++ ?

Avatar billede kamikaze Nybegynder
05. juni 2002 - 10:23 #1
Godt spm. Klarer Win32 ikke det???
Avatar billede kjsksed Nybegynder
05. juni 2002 - 10:52 #2
ifstream::seekg() og ifstream::tellg() retunerer en long. Size of long er 4 bytes hvilket er 32 bit. Da det er unsigned long, er det 31 bit hvilket giver max 2Gb før tallet bliver negativt. Det samme gælder for standard lib seek() og tell().
Avatar billede kamikaze Nybegynder
05. juni 2002 - 14:12 #3
Hmmm... Har aldrig haft det behov før... :-(
Avatar billede soepro Nybegynder
06. juni 2002 - 08:44 #4
Du kan omgå dette problem ved at anvende en løkke struktur, hvor du bevæger dig i forhold til nuv. position:

int longseek(FILE* stream, double noffset, int nwhence)
{
  const  long brkValue = 0x7FFFFFFF;
  long  toffset;
  double offset;
  int    whence;
  int    sign;
  int    retVal;

  /* If offset not above fseek's max long value, call fseek */
  /* directly and return it's value.                        */
  if (offset < brkValue)
    return fseek(stream, (long)offset, fromWhere);

  /* Offset above 2 GIGA - forward or back. Work on absolute */
  /* figures, and use only sign when necessary.              */
  if (noffset < 0)
  {
    offset = -noffset;
    sign  = -1;
  }
  else
  {
    offset = noffset;
    sign  = 1;
  };
  whence = nwhence;
  while (offset > 0)
  {
    if (offset > brkValue)
      toffset = brkValue;
    else
      toffset = offset;
    offset -= toffset;
    retVal = fseek(stream, toffset * sign, whence);
    if (retVal != 0)
      break;
    whence = SEEK_CUR;
  }; /* While not there yet.*/

  return retVal;
} // longseek
Avatar billede kjsksed Nybegynder
12. juni 2002 - 16:29 #5
Det er jeg godt klar over, men så kan jeg lige så godt benytte __lseeki64() og __ltelli64(). Det var for at undgå at omskrive min kode fra C++ stream klasse til standard C lib funktioner.
Avatar billede kjsksed Nybegynder
17. juni 2002 - 18:37 #6
Jeg har omskrevet min kode til at benytte _lseeki64 og __telli64.

soepro - tak for dit svar, men det løste ikke mit problem.

Da jeg ikke har modtaget et gyldigt svar har jeg tilbageført point til mig selv.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester