Toon posts:

[C++] CFile en CString.Length()

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik lees een file in met CFile:

CFile FileIn, FileOut;

FileIn.Open(FileInPath, CFile::modeRead , NULL);
nCount = FileIn.SeekToEnd();
FileIn.SeekToBegin();
char* pBuffer = new char[nCount];
FileIn.Read(pBuffer,nCount);

// copy buffer in a CString object
Str = pBuffer;

// clean up
delete pBuffer;
File.Close();

Dit werkt goed. Maar nu wil ik deze CString weer wegschrijven in een andere file.

nCount = Str.GetLength();
FileOut.Open(PathOut, CFile::shareDenyNone | CFile::modeWrite | CFile::modeCreate, NULL);

FileOut.Write(Str, nCount);
FileOut.Close();

Dit lijkt ook goed te gaan. Probleem is echter, dat CString::GetLength() een te groot getal returned.
Ik lees een file in van 1405 bytes. GetLength() returned 1432 bytes.

Er wordt nu dus teveel weggeschreven. Weet iemand waarom CString::GetLength() teveel bytes returned? Of hoe ik dit anders moet doen?

Tussen lezen en schrijven wordt er iets met de file gedaan. Dus de nCount van de ingelezen file kan ik niet gebruiken.
De bewerkingen vinden plaats met m.b.v. CString, dus het moet via CString blijven werken.

  • The End
  • Registratie: Maart 2000
  • Laatst online: 11:50

The End

!Beginning

Gefeliciteerd :) en wat is het probleem?

  • Feyd-Rautha
  • Registratie: November 2001
  • Laatst online: 02-08-2025
Prachtig dat je dat kunt .... :) . Dat kan ik ook :+

Maar wat is nu je probleem eigenlijk?

I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. Where the fear has gone there will be nothing. Only I will remain.


Verwijderd

Topicstarter
Sorry drukte per ongeluk op enter terwijl de Verstuur knop actief was.

  • The End
  • Registratie: Maart 2000
  • Laatst online: 11:50

The End

!Beginning

Waarom bepaal je zo omslachtig de grootte van de file?
CFile heeft een functie genaamd 'GetLength'. Probeer die eens.

Verwijderd

Topicstarter
Dat klopt. De uiteindelijke codering zal dat ook bevatten.

Maar het gaat mij om de lengte van een CString. Als ik een CString naar een file wil schrijven, moet ik de exacte lengte in bytes weten. GetLength() geeft echter meer bytes terug, dan er werkelijk zijn. Dat is het probleem.
Lezen werkt wel goed.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Op donderdag 25 juli 2002 09:57 schreef jw.oosting het volgende:
char* pBuffer = new char[nCount];
delete pBuffer;
Geheugen corruptie, moet delete[] zijn.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

zo bepaal je de grootte van een cstring ( char* )
code:
1
2
3
4
char *string; // (met een bepaalde inhoud :-)
int size;
for(size = 0; string[size]; size++);
size++;

"size" bevat nu het aantal bytes van die "string", dat is het aantal characters (1 byte) + een NULL (1 byte) (NULL-terminated-string :))

succes...

edit:

he... hij zette een smile neer op een plek waar dat niet moest :?

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op donderdag 25 juli 2002 17:19 schreef Jappie het volgende:
zo bepaal je de grootte van een cstring (char *D:
code:
1
2
3
4
char *string; // (met een bepaalde inhoud :-)
int size;
for(size = 0; string[size]; size++);
size++;

"size" bevat nu het aantal bytes van die "string", dat is het aantal characters (1 byte) + een NULL (1 byte) (NULL-terminated-string :))

succes...
1. Daar heb je strlen voor
2. De topicstarter gebruikt de klasse CString, wat dus nul komma niks te maken heeft met een asciiz string als char *

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Op donderdag 25 juli 2002 17:21 schreef .oisyn het volgende:
1. Daar heb je strlen voor
Ik denk dat 'jappie' wil laten zien dat programmeren helemaal niet zo moeilijk is.

Verwijderd

Op donderdag 25 juli 2002 17:21 schreef .oisyn het volgende:
1. Daar heb je strlen voor
2. De topicstarter gebruikt de klasse CString, wat
1. Je hebt gelijk...
2. oeps, hier op de helpdesk wordt je geest best wel gedood. Gedachte-foutje |:(

Verwijderd

Dit vond ik net in een help van het internet afgeplukt :) :
code:
1
2
3
4
int GetSize ()
[const]

Get the size of the string (not including the terminating '\0').

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Waarom gebruik je eigenlijk niet gewoon std::fstream en std::string? Als ik je code zo zie loop je zelf met lengtes te klooien terwijl dat met std::string voor je gebeurt.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Boy
  • Registratie: November 2001
  • Laatst online: 01-09 14:32

Boy

www.byoscoop.nl

Op donderdag 25 juli 2002 17:19 schreef Jappie het volgende:
zo bepaal je de grootte van een cstring ( char* )
code:
1
2
3
4
char *string; // (met een bepaalde inhoud :-)
int size;
for(size = 0; string[size]; size++);
size++;

"size" bevat nu het aantal bytes van die "string", dat is het aantal characters (1 byte) + een NULL (1 byte) (NULL-terminated-string :))

succes...

edit:

he... hij zette een smile neer op een plek waar dat niet moest :?
leest ie niet zo uit het veld? Ik zou verwachten dat je een access violation krijgt zodra de size groter wordt dan de string... :?

Naar de bioscoop? => gebruik de app op Byoscoop.nl


  • The End
  • Registratie: Maart 2000
  • Laatst online: 11:50

The End

!Beginning

Op vrijdag 26 juli 2002 10:27 schreef MSalters het volgende:
Waarom gebruik je eigenlijk niet gewoon std::fstream en std::string? Als ik je code zo zie loop je zelf met lengtes te klooien terwijl dat met std::string voor je gebeurt.
Als je CString gebruikt, dan hoef je ook geen rekening te houden met lengtes/geheugen e.d. Zijn probleem zit in het feit dat het lijkt alsof GetLength() van CString een groter getal teruggeeft dan het daadwerkelijke aantal bytes in de string..

Volgens mij komt het hierdoor:
code:
1
2
// copy buffer in a CString object
Str = pBuffer;

Ik heb ook iets dergelijks gehad. Het lijkt of de operator= niet goed werkt in dit geval. Als je b.v. dit doet:
code:
1
2
3
4
for(int i = 0;i < nCount;i++)
{
   Str += pBuffer[i];
}

Dan geeft Str.GetLength() wel het goede getal terug. n.l. nCount.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Op vrijdag 26 juli 2002 10:51 schreef The End het volgende:
Volgens mij komt het hierdoor:
code:
1
2
// copy buffer in a CString object
Str = pBuffer;

Ik heb ook iets dergelijks gehad. Het lijkt of de operator= niet goed werkt in dit geval.
Helemaal gelijk, we hebben met z'n allen lopen slapen. :Z pBuffer is helemaal niet NULL-terminated. CString::operator=(char*) verwacht een null-terminated string. Blijkbaar stond er na 1432 karakters toevallig een \0 byte.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
Op vrijdag 26 juli 2002 12:26 schreef MSalters het volgende:

[..]

Helemaal gelijk, we hebben met z'n allen lopen slapen. :Z pBuffer is helemaal niet NULL-terminated. CString::operator=(char*) verwacht een null-terminated string. Blijkbaar stond er na 1432 karakters toevallig een \0 byte.
|:(

Is helemaal correct. Had ik werkelijk niet aan gedacht. Maar ik ben gelukkig niet de enige, die het over het hoofd zag. Bedankt voor je heldere ingeving.

Verwijderd

Op vrijdag 26 juli 2002 10:50 schreef Boy het volgende:
leest ie niet zo uit het veld? Ik zou verwachten dat je een access violation krijgt zodra de size groter wordt dan de string... :?
nope... dit gaat helemaal goed.
zet het ff als een IFje neer:
code:
1
if(string[n])

als string[n] nou 'a' is, komt er true uit de IF...
als string[n] nou '\0' is, komt er false uit de IF...

het loopje zal dus ophouden :)

Je hebt wel gelijk als "string" geen NULL-terminated string is, want dan leest ie inderdaat door bij het einde van de string (hij stopt op de '\0')
Pagina: 1