Ik heb dus via een voorbeeld da ik op google heb gevonden een file proberen te lezen: eerst heb ik een tekst file gelezen: maar na elke 16 tekens tekst krijg ik 8 van deze tekens 'Ì', de char array is zo gedeclaceerd char buffer[16] en de read instructie zo: myFile.read (buffer, 16). Nu heb ik nog een probleem als ik bv een jpg file lees en ik zet bv buffer naar 4096 missen er veel tekens, dit probleem heb ik niet bij een tekst file. Weet er iemand wat er fout zou kunnen zijn gegaan?
Verwijderd
topic titel is wat verwarrend, gebruik je gewoon native (i386 code) of werk je managed?
[ Voor 8% gewijzigd door Verwijderd op 30-12-2002 00:56 ]
Verwijderd
Je denkt... right.. kan je wat code posten? hoe je bv je file opend? probleem is namelijk dat een managed char (System.char) een 16 bits unicode char is terwijl in de unmanged world een char 8 bits is.. wat het wel weer logish maakt dat als je 16 tekens leest er maar 8 karakters van je buffer gevuld zijn (8*2bytes per char)
hier is de code:
char buffer[16];
ifstream myFile ("c:\\EMSocket.log", ios::in | ios::binary);
do
{
myFile.read (buffer, 16);
Ctrtextbox1 = Ctrtextbox1 + buffer;
}while (!myFile.eof());
einde code
ik krijg effectief 16 karakters op mijn scherm, er staan er alleen nog 8 achter die er niet moeten staan, ik heb ook al geprobeerd met sizeof(buffer) maar helpt ook niet.
vb:11/21/02 13:12:5ÌÌÌÌÌÌÌÌ, in het begin is de buffer wel gevuld met Ì
char buffer[16];
ifstream myFile ("c:\\EMSocket.log", ios::in | ios::binary);
do
{
myFile.read (buffer, 16);
Ctrtextbox1 = Ctrtextbox1 + buffer;
}while (!myFile.eof());
einde code
ik krijg effectief 16 karakters op mijn scherm, er staan er alleen nog 8 achter die er niet moeten staan, ik heb ook al geprobeerd met sizeof(buffer) maar helpt ook niet.
vb:11/21/02 13:12:5ÌÌÌÌÌÌÌÌ, in het begin is de buffer wel gevuld met Ì
Een binaire file lees je in .NET het best in door gebruik te maken van objecten van de FileStream class.
code:
1
2
| FileStream str = new FileStream ("filename", FileMode.Open, FileAccess.Read);
int aByte = str.ReadByte(); |
https://fgheysels.github.io/
oke, dat lost mijn probleem op met bytes, maar als ik char gebruik zijn er nog altijd die tekens op het einde
ik heb een soort van oplossing gevonden, als ik 35 bytes lees is de buffer wel helemaal gevuld,kan iemand mij een verklaring geven waarom?
Verwijderd
zeg je wel dat er niets in die array moet zitten ??
wat ik bedoel is, dat als je een array declareerd, zit er niet niets in (je hebt hem nog niet gedefineerd), dus vindje rare waardes die toevallig op het geheugeplekje staan die jij wil gaan gebruiken...
wat je kan proberen is dus eerst alle elementen van je array NULL maken, en dan je functie eroverheen halen....
dan kan je pas kijken of de elementen die je niet nodig had, nog steeds NULL zijn...
zo niet, dan zit het probleem toch ergens anders
wat ik bedoel is, dat als je een array declareerd, zit er niet niets in (je hebt hem nog niet gedefineerd), dus vindje rare waardes die toevallig op het geheugeplekje staan die jij wil gaan gebruiken...
wat je kan proberen is dus eerst alle elementen van je array NULL maken, en dan je functie eroverheen halen....
dan kan je pas kijken of de elementen die je niet nodig had, nog steeds NULL zijn...
zo niet, dan zit het probleem toch ergens anders
je code:
wat gaat er fout?
Je leest 16 bytes in een 16 byte buffer. Echter zijn C-strings altijd zero-terminated, oftewel: het laatste character moet een 0 zijn. Aangezien je buffer 16 bytes is is er geen ruimte voor een extra 0 op het eind.
Oplossing: maak je buffer 17 bytes groot en zet buffer[16] (de laatste char dus) op 0
C++:
1
2
3
4
5
6
7
| char buffer[16]; ifstream myFile ("c:\\EMSocket.log", ios::in | ios::binary); do { myFile.read (buffer, 16); Ctrtextbox1 = Ctrtextbox1 + buffer; }while (!myFile.eof()); |
wat gaat er fout?
Je leest 16 bytes in een 16 byte buffer. Echter zijn C-strings altijd zero-terminated, oftewel: het laatste character moet een 0 zijn. Aangezien je buffer 16 bytes is is er geen ruimte voor een extra 0 op het eind.
Oplossing: maak je buffer 17 bytes groot en zet buffer[16] (de laatste char dus) op 0
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.
Je kunt je ook afvragen hoe zinnig het is te werken met relatief ingewikkelde C-style strings, terwijl je nota bene C++ gebruikt.
Verwijderd
je bedoelt om ANSI-String te gebruiken ??Soultaker schreef op 30 december 2002 @ 20:30:
Je kunt je ook afvragen hoe zinnig het is te werken met relatief ingewikkelde C-style strings, terwijl je nota bene C++ gebruikt.
een char[] / char* is nl ook NULL-terminated... dus hou je hetzelfde probleem
Soultaker: je kunt jammer genoeg geen std::string gebruiken om een x aantal bytes uit een std::istream te extracten 
je zult dus altijd een char array als tussenweg moeten gebruiken. Wat wel kan is gewoon de char array niet zero-terminated maken en een std::string construeren van de 16 bytes in de char array:
je zult dus altijd een char array als tussenweg moeten gebruiken. Wat wel kan is gewoon de char array niet zero-terminated maken en een std::string construeren van de 16 bytes in de char array:
C++:
1
2
| // de buffer (char buffer[16]) is op dit moment al gevuld std::string str (buffer, buffer + 16); |
[ Voor 57% gewijzigd door .oisyn op 30-12-2002 20:44 ]
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.
Ik zat te denken dat je beter std::string of de .NET-variant daarvan kan gebruiken. Dan hoef je je niet met zulke details bezig te houden.Verwijderd schreef op 30 December 2002 @ 20:38:
je bedoelt om ANSI-String te gebruiken ??
een char[] / char* is nl ook NULL-terminated... dus hou je hetzelfde probleem
Toen bedacht ik me dat het om het lezen van binaire data ging en een byte array dus wel op z'n plaats is. Dan moet je 'm echter niet weergeven alsof 't een string was, natuurlijk.
edit:
.oisyn je bent laaaaaat!
[ Voor 6% gewijzigd door Soultaker op 30-12-2002 20:45 ]
[excuus-mode]
ben vs.net 2003 RC1 aan het installeren
[/excuus-mode]
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.
Een 0 plaatsten heeft inderdaad het probleem opgelost, nu heb ik nog 1 klein vraagje, waarom is het als ik die buffer laat weergeven in een text venster er karakters missen, en met de zelfde buffer schrijf ik weg naar een file en is deze is inorde, als ik die dan open met een tekst editor zijn de bestanden identiek hetzelfde
Ik weet niet wat er in moet staan, maar binaire data schrijven naar de console gaat over het algemeen niet echt goed, omdat de console op een bepaalde manier reageert op control characters... denk bijvoorbeeld aan ascii code 7, dat een belletje genereert, de tab (9), de carriage return (13) en de linefeed (10) enzovoort
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.
Pagina: 1