Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
30.08.2002, 13:56
snoopdog



Hi, als owen ncih die beiden Funktion verwende um ne normale Text Datei einzulesen, kommt nur mist also íííííííýýýý das ist dei ausgabe warum??
Hier mal mein code:

Quellcode:

    HANDLE File;
    char *buffer;
    DWORD buffer1;

    buffer = new char[10];

    File = CreateFile(FileName,GENERIC_READ,FILE_SHARE_READ,(LPSECURITY_ATTRIBUTES)NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED ,(HANDLE)NULL);
    
    ReadFile(File,&buffer,10,&buffer1,NULL);

    CloseHandle(File);

    MessageBox(NULL,buffer,"hallo",MB_OK);

--

Visit our 500er Gamer Lan
@ www.evil-lanparty.de or
@ www.evil-havoc.com
Visit the HaVoc Lanparty Community
@ www.havoc-lanparty.com

zum Seitenanfang zum Seitenende Profil || Suche
001
30.08.2002, 15:34
Archangel



uuuhhhhmmm..
a.) wieso buffer = new char[10]; ? warum nich char buffer[10] ? du deletest buffer btw nich
b.) du liest 10 zeichen ein, der buffer is 10 bytes groß, allerdings vergisst du den terminator, also entweder nur 9 zeichen einlesen, oder buffer vergrößern (buffer[9]/buffer[10] auf 0 setzen)

ich WEIß zwar nich, wie das mit ReadFile is, aber ich denke nich das die funktion einen ptr auf einen char-ptr erwartet, also da buffer ein zeiger is, müsste nur buffer (ohne address-operator) da stehen, wär buffer ein array, würde beides gehen.

es müsste also so aussehen:

Quellcode:
HANDLE file;
char buf[10];
DWORD bytes_read;
file = CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, (LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, (HANDLE)NULL);

ReadFile(file, sizeof(buf)-1, 10, &bytes_read, 1, NULL);
CloseHandle(file);
buf[bytes_read] = '\0';
MessageBox(NULL, buf, "Hallo", MB_OK);

alternative kannst du buf auch mit memset(buf, 0, sizeof(buf)); 'nullen'

--

Mar 01 01:10:13 <voice> jo
Mar 01 01:10:40 <voice> bis dann ^^
Mar 01 01:11:20 <Archangel> jo
**** ENDING LOGGING AT Tue Mar 1 01:58:13 2005

zum Seitenanfang zum Seitenende Profil || Suche
002
30.08.2002, 16:53
[RMen]OneStone



memset(buf, 0, sizeof(buf));

Uaaah, da läuft es mir kalt den Rücken runter. sizeof ist nun wirklich nicht gerade geeignet um die Länge eines Arrays herrauszufinden (ich behaupte nicht, dass es nicht geht). Stell dir mal vor, du machst später ne dynamische initialisation via malloc / new und da ist noch dein sizeof(...) (was dann 4 entspricht) - Supa!

--

georg-wicherski@pixel-house.net | http://www.pixel-house.net/ - Coding Resource| http://www.google.de/

zum Seitenanfang zum Seitenende Profil || Suche
003
30.08.2002, 17:59
snoopdog



hmm nur hab ich es so, das er mir zwar den inhalt ausgibt aber immenroch diese blöden zeichen da hinmacht, nu is die ausgabe die, halloíííííí
wie bekomm ich diese Zeichen weg, bzw. was bedeuten die überhaupt???

hallo steht übrigens in meiner datei udn heir der code

Quellcode:
    HANDLE File;
    char *buffer;
    DWORD buffer1 = NULL;


    buffer = new char[10];

    File = CreateFile(FileName,GENERIC_READ,NULL,NULL,OPEN_EXISTING,NULL ,NULL);
    
    ReadFile(File,buffer,9,&buffer1,NULL);

    CloseHandle(File);

    MessageBox(NULL,buffer,"hallo",MB_OK);



    delete[] buffer;

    return true;

--

Visit our 500er Gamer Lan
@ www.evil-lanparty.de or
@ www.evil-havoc.com
Visit the HaVoc Lanparty Community
@ www.havoc-lanparty.com

zum Seitenanfang zum Seitenende Profil || Suche
004
30.08.2002, 18:33
Archangel



ich sag nur '\0'...

--

Mar 01 01:10:13 <voice> jo
Mar 01 01:10:40 <voice> bis dann ^^
Mar 01 01:11:20 <Archangel> jo
**** ENDING LOGGING AT Tue Mar 1 01:58:13 2005

zum Seitenanfang zum Seitenende Profil || Suche
005
30.08.2002, 19:12
TheTinySteini



OneStone: was denn? memset in Verbindung mit sizeof ist eine völlig legitime und oft angewandte Methode, um einen Speicherplatz mit z.B. Nullen zu füllen. Gut, bei per new u.ä. initialisierten Arrays hat man dann ein Problem. Aber darum geht's in dem Fall ja auch gar nicht. Man kann ja nicht Äpfel mit Birnen vergleichen.
Im Fall von malloc/new wird man ja irgendwo ne Variable haben, die die Länge beinhaltet, dann nimmt man halt die.

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche
006
30.08.2002, 19:54
Kriz



Und für alle Neugierigen, die nicht wissen, wie man die Länge eines Arrays in C/C++ berechnen kann:

Quellcode:int array[] = {1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7};
int length = sizeof(array) / sizeof(array[0]);

sizeof(array) berechnet die Gesamtsumme aller Elemente in Bytes, sizeof(array[0]) berechnet die Anzahl der Bytes des Elements [0] im Array. Teilt man nun die Gesamtsumme durch die Größe eines einzelnen Elements, erhält man die Anzahl der Elemente in dem Array. In diesem Fall käme für length die Zahl 17 raus =)

Das funktioniert aber nur direkt. Die Berechnung der Arraylänge als Bestandteil einer Funktion funktioniert nicht:

Quellcode:int arraylength(int array[])
{
    return sizeof(array) / sizeof(array[0]);
}

Anstatt des gesamten Arrays wird nämlich nur der Startzeiger des Arrays an die Funktion übergeben und der ist auf modernen CPUs immer 4 Bytes groß (32 Bit Adresse). Die Funktion würde z.B. auf Win32 Systemen daher 1 zurückgeben (4 / 4 = 1) anstatt 17 (68 / 4 = 17).

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
007
30.08.2002, 23:23
Tron



Zitat:
[RMen]OneStone postete
memset(buf, 0, sizeof(buf));

Uaaah, da läuft es mir kalt den Rücken runter. sizeof ist nun wirklich nicht gerade geeignet um die Länge eines Arrays herrauszufinden (ich behaupte nicht, dass es nicht geht). Stell dir mal vor, du machst später ne dynamische initialisation via malloc / new und da ist noch dein sizeof(...) (was dann 4 entspricht) - Supa!

memset mit new[] ist voelliger quatsch, da new[] automatisch fuer jedes element den standardkonstruktor aufruft, was bei nativen typen dem setzen von 0 entspricht, also waere das dann doppelgemoppelt.

auf malloc geh ich garnet ein, das is c...

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
008
30.08.2002, 23:54
Archangel



naja in C kann man sich ja auch ne eigene alloc funktion schreiben, die den allokierten speicherbereich mit memset auf 0 setzt, dann isses auch komfortabler sachen wie outofmemory oso zu handhaben..

@OneStone: tja, man sollte wissen was man tut.. ausserdem wenn du n ptr hast übergibst du ja an sizeof auch nichmehr das array, sondern den zeiger auf das erste element des arrays..

@Tron('s sig): pratchett r0x :D besonders gevatter tod (wobei die wachen-bücher auch rocken)

--

Mar 01 01:10:13 <voice> jo
Mar 01 01:10:40 <voice> bis dann ^^
Mar 01 01:11:20 <Archangel> jo
**** ENDING LOGGING AT Tue Mar 1 01:58:13 2005

zum Seitenanfang zum Seitenende Profil || Suche
009
31.08.2002, 08:25
snoopdog



aah,also waren diese komsichen zeichen einfach nur das nullterminat oder wie des heißt, hättet irh ja auhc gleich sagen können *g*, aber trotzdem danke!!

--

Visit our 500er Gamer Lan
@ www.evil-lanparty.de or
@ www.evil-havoc.com
Visit the HaVoc Lanparty Community
@ www.havoc-lanparty.com

zum Seitenanfang zum Seitenende Profil || Suche
010
31.08.2002, 10:16
Tron



nein, da hat einfach nur der terminator ('\0') gefehlt. so hat die messagebox einfach weiter datenmuell ausgegeben bis sie zufaellig auf '\0' gestosen ist.

um das problem zu loesen schreib einfach an das ende ein '\0', die position kannst ja einfach ueber die anzahl der gelesenen bytes bestimmen.
ReadFile haengt an das ende keine '\0' da es immer im binaermodus arbeitet.

btw: schmeiss den ganzen winapi-kram zum zugriff auf dateien in die tonne und benutz filestreams (header "fstream.h", ofstream, ofstream, fstream)
ausser du willst memory mapped files benutzen, da bist auf die winapi angewiesen, aber ich vermute, das willst du nicht. (;

<ot>
@Archangel(s rechtschreibung):
es gibt im deutschen nur einen fall fuer 's und das ist die kontraktion von 'es' an das voherige wort (er kann es -> er kann's).
bei allem anderen KEIN apostroph, das ist uebelste verdenglischung. )<
ich bin stolz auf die deutsche sprache! verschandelt sie nicht! (:
(und komm mir nicht mit gros-klein-schreibung, das ist einfach nur faulheit. *g*)
</ot>

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
011
31.08.2002, 11:33
Hessie J.



*wegedit weil schon gesagt*

--


Dieser Beitrag wurde am 31.08.2002 um 11:34 von Hessie J. bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
012
31.08.2002, 16:12
theDon



Zitat:
ich bin stolz auf die deutsche sprache! verschandelt sie nicht! (:

Zitat:
gros-klein-schreibung

jaja *gg*

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before

zum Seitenanfang zum Seitenende Profil || Suche