formatierte Datei einlesen
-
Bei einem Programm von mir wird der Text von einer Datei eingelesen. Die Datei ist sieht folgendermaßen aus:
Hier steht ganz normaler Text. --------------------------------------- Das ist ein anderer Text. --------------------------------------- Leider funktioniert das Einlesen nicht. --------------------------------------- ... bla bla.
Die Textabschnitte sollen einzeln verfügbar sein.
Die Variable in der alles gespeichert wird, ist ein Array:text[si][ci]
So sieht der Algorithmus bisher aus:
void read_text_file(char *lng) { FILE *stream; int ch, i = 0, si = 0, ci = 0; if((stream = fopen(lng,"r")) == NULL) { printf("\nKonnte Sprachdatei nicht finden!\n"); exit(1); } while(!feof(stream)) { ch = getc(stream); if(ch == '-') i++; else { //putchar(ch); text[si][ci] = ch; } if(i == 40) { i = 0; si++; } ci++; } }
Nur leider geht es nur bis zum ersten '-', danach ist Schluss. putchar(ch) gibt den gesamten Dateiinhalt ohne '-' aus. text[0] beinhaltet den ersten Textabschnitt (hier: "Hier steht ganz normaler Text."). text[1] (müsste hier "Das ist ein anderer Text." enthalten), text[2], ... ist leer
.
Ich vermute es ist ein Logikfehler, doch kann ich ihn nicht finden.
Vielleicht fällt euch auch ein besseres Dateiformat ein, wo das Einlesen leichter ist.
-
probiers mit fgets und lies einfach zeile für zeile
-
Na ja, C ist es ja nicht gerade ...
In C würde ich das so machen:
FILE *fp; char buf [256]; char arr [256][256]; if ( (fp = fopen( "file", "r")) == NULL){ perror( file); printf( "\nOalder Depp, dös woar nix..."); exitus( nirwana); } for ( i=0; i<255 && fgets( buf, 255, fp); i++){ if ( *buf != '-') strcpy( arr[i], buf); } fclose( fp); *arr[i] = 0;
-
Erstmal vielen Dank für die Antworten.
fgets funktioniert wunderbar, doch leider kann man so nur ganze Sätze einlesen, weil die Funktion bei \n abbricht. (meine Schuld, habe es falsch erklärt)
So wie die Datei oben aussieht, geht es. Doch bei z.B.Das ist ein Textabschnitt. Ein neuer Absatz im 0. Textabschnitt. Sogar mit Leerzeilen. --------------------------------------- Hier steht ganz normaler Text. --------------------------------------- Das ist ein anderer Text. ---------------------------------------
ist text[0] bzw arr[0] nur "Das ist ein Textabschnitt." ohne die folgenden Sätze.
@Scheppertreiber: Dein Algorithmus ist gut geschrieben
. Funktioniert auch wunderbar. Nicht weiter schlimm ist nur, dass der Index des Arrays nicht fortlaufend ist, d.h Lücken hat.
-
ups.
FILE *fp; char buf [256]; char arr [256][256]; if ( (fp = fopen( "file", "r")) == NULL){ perror( file); printf( "\nOalder Depp, dös woar nix..."); exitus( nirwana); } for ( i=0; i<255 && fgets( buf, 255, fp); ){ if ( *buf != '-') strcpy( arr[i++], buf); } fclose( fp); *arr[i] = 0;
-
Es funktioniert jetzt alles, wie es soll. Habe den Code von Scheppertreiber noch ein wenig verändert.
void read_text_file(char *lng) { FILE *stream; int i = 0; char buf[1024]; char *c; if((stream = fopen(lng,"r")) == NULL) { perror(lng); printf("\nKonnte Sprachdatei nicht finden!\n"); } while(i<255 && fgets(buf, 1023, stream)) { if(*buf != '_') { strcpy(text[i], buf); while((c = strchr(text[i], '/')) != NULL) *c = '\n'; i++; } } fclose(stream); *text[i] = 0; }
Mit _ kann man einen neuen Textabschnitt einleiten und mit / einen Zeilenumbruch erzeugen.
-
while((c = strchr(text[i], '/')) != NULL) *c = '\n';
Schee ... was soll das den machen ?
-
Dadurch werden in text / in \n umgeformt. fgets hört ja bei Zeilenumbrüchen auf einzulesen.
strchr durchsucht einen String nach einem Zeichen und gibt, wenn was gefunden wurde, den Pointer darauf zurück, mit dem man dann direkt auf die Speicheradresse von dem String zugreifen kann.
Und heißt das nicht sheesh?
-
/ in \n umformen ? Drogen ???
Vielleicht brauche ich ab und zu mal / in \ umformen - aber in einen LF ? Nee.
-
Ich gebe zu, dass man / öfters mal braucht. Vielleicht reserviere ich noch ein anderes selteneres Zeichen für einen Umbruch. (eigentlich geht's nur ums Prinzip)
Oder gibt es eine Möglichkeit die Datei unumständlicher einzulesen?Soll LF language file heißen?
Scheppertreiber schrieb:
Drogen ???
Solche Kommentare sind überflüssig. Oder sollte das lustig sein?
-
Lustig wäre, / als Zeilenterminierung zu verwenden. Das habe selbst ich noch nicht gesehen.