Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » kann mir das jemand erklaeren ?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
11.08.2006, 12:30 Uhr
~Holger80
Gast


Hallo zusammen,

kann mir mal einer bitte diesen Programmcode erklaeren ?
Ware echt nett



C++:
while( !feof( input ) ) {

        *in++ = fgetc( input );
    }
      printf("   test %d  ",feof( input ));
    *( in - 1 ) = '\0';

    fclose( input );




gruesse
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
11.08.2006, 12:40 Uhr
0xdeadbeef
Gott
(Operator)


Das ist ein nicht besonders effizienter Code, eine Datei vollständig in den Speicher zu lesen. Ich nehme an, dass "in" ein char* ist, der zu Beginn auf einen vorher entsprechend der Länge der Datei angelegten Buffer zeigt (wenn der statisch ist, ist der Code nicht nur unschön, sondern auch verbuggt). Aaalso, der Reihe nach:

C++:
while(!feof(input)) { // solange die Datei nicht zuende ist
  *in++ = fgetc(input); // Lies ein Zeichen aus der Datei ein, schreib es an die Stelle, auf die in zeigt, erhöhe in
}

printf("   test %d  ", feof(input)); // Testausgabe, ziemlich nutzlos.
*(in - 1) = '\0'; // EOF-Zeichen durch einen Sentinel ersetzen, der den String abschließt

fclose( input ); // Datei schließen


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
11.08.2006, 12:48 Uhr
~Holger80
Gast


Danke Dir 0xdeadbeef,

ja hast recht so sieht es aus, aber warum ist das nicht effizient, ich bin nicht so erfahren was C angeht, wie wuerdest Du das denn machen ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
11.08.2006, 13:19 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Um die Datei komplett in den Speicher zu lesen, musst du erstmal soviel Speicher haben (oder es verursacht ne Swappingorgie). Auch steht dieser Speicher dann anderen Applicationen nicht mehr zur Verfügung...

Sinnvoller ist nur das einzulesen/abzuarbeiten was man gerade braucht. Meist eignet sich zeilenweises einlesen...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
11.08.2006, 14:25 Uhr
0xdeadbeef
Gott
(Operator)


Entweder das, oder wenn man unbedingt die ganze Datei im Speicher braucht, mit fread blockweise einlesen, das ist effizienter.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
11.08.2006, 14:58 Uhr
~Holger80
Gast


und noch eine andere Frage...



C++:
fseek( input, 0, SEEK_END );
long input_length = ftell( input );
fseek( input, 0, SEEK_SET );



Warum muss ich den Datenzeiger wieder an den Anfang setzen, nachem ich die groesse der Datei herausgefunden hab ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
11.08.2006, 15:01 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Ich vermute mal das wurde dazu genutzt entsprechend der Dateigröße speicher zu allokieren.
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
11.08.2006, 15:07 Uhr
~Holger80
Gast


ja ok, das ist schon einleuchtend, aber ich kann mir die letzte Zeile nicht so genau erklaeren, ich habe die Groesse der Datei ermittelt, aber warum muss ich denn den Dateinzeiger wieder nach vorne setzen ?
wenn ich es auskommentiere bekomme ich auch keine ausgabe...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
11.08.2006, 15:25 Uhr
0xdeadbeef
Gott
(Operator)



C++:
fseek( input, 0, SEEK_END ); // Gehe ans Ende der Datei
long input_length = ftell( input ); // Sag mir, wie weit ich vom Anfang der Datei entfernt bin
fseek( input, 0, SEEK_SET ); // Geh an den anfang der Datei


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: