On Sun, 29 Aug 2010 14:59:26 +0200
lano <[email protected]> wrote:

> Nathanael Schweers schrieb:
> >> int f;
> >>     
> > /* du brauchst kein int, sondern ein (FILE *). int ist für file
> > deskriptoren, fgets und fopen aber benutzen zeiger auf FILE (ist ein
> > wrapper um filedeskriptoren, da ist sogar ein puffer mit drin). */
> >   
> Ah ja, macht sinn. Das mit * zeigt dann auf eine adresse wo die daten 
> dann abgelegt sind, wobei mich bei einer variablen die adresse ja
> nicht interessiert.
> in perl hätt ich ja ein filehandle, von daher versteh ich schon warum 
> int völlig falsch ist.
> Hab ich das halbwegs richtig verstanden?
Denke ich schon, ja. 
> >> char Text[600];
> >>
> >> char read_file(char *file_name) {
> >>     
> > /* du willst vermutlich nicht "char", sondern "char *" zurückgeben*/
> >   
> hier im grunde das selbe, das was die funktion zurück gibt wird in
> der adresse xy gespeichert, ich will also nur die adresse wissen wo
> ich dann die daten finde. warum das so ist ist mir zwar völlig
> unklar, ich nehms aber mal so hin.
> >>     f = fopen(file_name,"r");
> >>     while( fgets(Text, sizeof(Text), f) !=0 )
> >>     
> > /* was machst du da? das sieht so aus als würdest du solange
> > fgets !=0 zurückgibt die datei schließen, und das ganze auch noch
> > in den immer gleichen puffer schreiben (die alten daten gehen also
> > verloren). */ 
> Mein got ja, jetzt raff ichs aber erst, das fclose(file_name) gehört
> ja noch zur while schleife.
> ; hab ich völlig übersehn.
> >>     fclose(file_name);
> >>     return Text;
> >>     
> > /* return Text; wird vermutlich nichtmal übersetzt, da von (char *)
> > nach char konvertiert wird. */
> >   
> Das versteh ich nun nicht mehr, mal angenommen ich scheibe die daten
> in Text, geb ich dann mit return Text nicht die daten wieder aus?
> müsst ich *Text zurück geben, also die adresse wo die daten liegen?
> 
> in perl kann ich einfach:
> $text = "hallo";
> return $text;
In perl ist ein string ein scalar, in C nicht. 
C kennt keinen eigenen typ für strings, sondern strings sind einfach
nur Arrays (listen) von chars. Um das Ende zu markieren bekommt das
letzte Element den wert 0 (== '\0'). Das ist nicht das Zeichen '0'!
Wenn du nun nen string hast und return Text; schreibst ist damit die
Adresse des ersten Elements des Arrays gemeint. Darum brauchst du auch
einen char * als Rückgabewert, sonst bekommst du bloß ein Zeichen (und
einen Kompilerfehler). 
Da du kein Array zurückgeben kannst, sondern nur die Anfangsadresse
dessen musst du auch vorher das Array an einer Stelle ablegen die beim
verlassen der Funktion nicht ungültig wird. Alle lokalen Variablen
werden ja schließlich wieder freigegeben - und damit eben auch die
Variable Text. Ich schreib mal ein kleines bisschen code hier hin (und
verzichte mal um die Verwirrung niedrig zu halten absichtlich auf
Fehlerbehandlung):

#include <stdio.h>
#include <stdlib.h>

#define BUFSIZE 600

char *read_file(char *filename) {
        FILE *f=fopen(filename);
        char *buffer=malloc(BUFSIZE+1); /* +1 für das 0-byte am ende */
        buffer[0]=0; /*stringende an den anfang setzen, manche
        Funktionen reagieren sonst komisch und schreiben nicht an den
        Anfang*/
        while(strlen(buffer)<BUFSIZE) {
                if(fgets(buffer+strlen(buffer),BUFSIZE-strlen(buffer),f)==0)
                {
                        fclose(f);
                        return buffer;
                }
        }
        fclose(f);
        return buffer;
}

Ich bin mir nicht 100%ig sicher ob das richtig ist, ich hab fgets und
konsorten nicht viel benutzt und hab das grad schnell hingeklatscht. 
Falls also jemand einen Fehler findet darf er gerne korrigiert werden ;)
Aber wie gesagt, ich empfehle sehr dringend dazu ein Buch zu lesen. 
        
> 
> machen, und die funktion gibt hallo zurück
> >> bei der printf Anweisung, wofür ist %s %c %l und was weis ich was
> >> es da noch gibt, habs erst mit %s versucht, dann hab ich gedacht
> >> ok ist ja nen char versuchstes mit %c :)
> >>
> >>     
> > siehe "man 3 printf" oder "man 3p printf" dazu.
> > %s sagt printf dass hier ein string reinkommt. %c ein zeichen, %l
> > steht für "long". Davon gibt's ne menge mehr, z.b. auch für
> > floating point. 
> Ok, hab ich kapiert.
> >> Perl ist wesendlich einfacher :)
> >>     
> > Perl ist auf ne andere art obskur ;)
> >   
> Hmm, ich komm da eigendlich gut mit zurecht.
> > Aber stimmt schon, C ist für neulinge nicht gerade einfach, und ich
> > finde dass die standard bibliothek es einem neuling nicht gerade
> > einfacher macht.
> Ich hatte c mal in der berufsschule, ist schon 15 Jahre her, das sah 
> dann so aus das der Lehrer die Tafel in 5 min vollgeschrieben hat,
> ich war noch halbwegs interessiert aber all meine fragen konnt er mir
> nicht beantworten, "weil das so ist" war seine standard Antwort,
> warum konnt er mir in keinem fall erklären, nach 6 Monaten hab ich
> aufgegeben zu fragen und wie alle anderen gewartet bis ich den
> lösungszettel bekomme und hab einfach abgeschrieben.
> > Ich hoffe dass Ich dich nicht zu sehr verwirrt habe. 
> >
> >   
> Geht so ;) ich hoffe ihr habt was zum lachen, weil ich mich so schwer 
> tue. :)
> 
> -sven-
> --
> ----------------------------------------------------------------------------
> PUG - Penguin User Group Wiesbaden - http://www.pug.org

--
----------------------------------------------------------------------------
PUG - Penguin User Group Wiesbaden - http://www.pug.org

Antwort per Email an