[c] Zeilenweises lesen von strings aus Datei

wecksepp

Grünschnabel
Hallo Forum,

vorab als Info: Ich arbeite unter Linux und compiliere mit gcc.
Nun zu meinem Problem:
Ich möchte eine Funktion schreiben, die eine bestimmte Anzahl von Zeilen zeilenweise aus einer Textdatei liest. Diese Zeilen möchte ich dann im Hauptprogramm einzeln ausgeben können.

Mein Ansatz für die Funktion war:
- ein Array von Stings anlegen (string[10])
- zeichenweise aus der Datei lesen (zeichen=fgetc(lesezeiger); )
- wenn zeichen=='\n', ein Arrayelement weiter springen (strcat(string[ i ],'\0'; i++; )
- wenn zeichen!='\n', zeichen an Arrayelement anhängen (strcat(string[ i ],zeichen); )
- wenn zeichen==EOF dann Ende

Hier hab ich Probleme mit der Funktion strcat(), denn die verlangt als zweites Argument einen String und kein char. Wie kann ich das Problem lösen bzw. gibts für dieses Zeilenweise lesen aus der Datei einen einfacheren Weg?


Das Zweite Problem besteht darin, wie ich im Hauptprogramm diese Zeilen nach Belieben ausgeben kann.
z.B.
Code:
printf("%s\n",String[3]);
printf("%s\n",String[7]);

Vielen Dank schon im Voraus, für Eure Hilfe.
 
1.: Wenn du nur ein einzelnes Zeichen an den String anfügen willst, wozu dann strcat nehmen? Da genügt es schließlich auch, einfach am entsprechenden Index des Strings das \0-Zeichen zu schreiben.

2.: Zum Lesen von Strings aus einem Stream gibt es fgets.

3.: Wenn du die Strings anzeigen willst, bietet sich als einfachste Lösung eine for-Schleife an, mit der du das String-Array durchläufst. Schließlich ist ja die Anzahl der Strings bekannt.

-Gawayn
 
Hallo,
ich hab's mal so gemacht wie vorgeschlagen und es funktioniert auch aber ich finde die Lösung nicht besonders elegant. Ich habe dadurch Strings mit fester Länge. Mir wäre es lieber, wenn die Strings eine variable Länge hätten. Jeder genau so lange, wie die entsprechende Zeile im Textfile. Wenn ich fgets benutze, muß ich ja auch eine feste Stringlänge eingeben - irgendwie unschön.
Beim Ausgeben muß ich jedes Zeichen einzeln ausgeben. Auch das ist keine schöne Lösung. Leider tue ich mir mit Zeigern etwas schwer. Könnte mir jemand kurz erklären, wie ich Zeiger auf die einzelnen Strings anlege und die Strings beim ausgeben über diese Zeiger anspreche?
Code:
Hier mein (unschöner) Code:
//---------------------------------------------------------------------------------------------
#include <stdio.h>
#include <string.h>

  FILE *lesezeiger;
  char *dateiname="./text.txt";
  char zeichen;
  char zeile[6][40];
  int i=0,j=0;

int einlesen(){
  lesezeiger=fopen(dateiname,"r");
  zeichen=fgetc(lesezeiger);
  while(zeichen!=EOF){
    if (zeichen=='\n'){
      zeile[j][i]='\0';
      j++;
      i=0;
    } else {
      zeile[j][i]=zeichen;
    }
    i++;
    zeichen=fgetc(lesezeiger);
  }
  fclose(lesezeiger);
}

int main(){
  einlesen();
  for(j=0;j<6;j++){
    for(i=0;i<40;i++){
      printf("%c",zeile[j][i]);
    }
    printf("\n");
  }
}
//---------------------------------------------------------------------------------------------
das Textfile:
//---------------------------------------------------------------------------------------------
Hallo
dies ist ein c-Programm,
das einen Text zeilenweise
aus einem Textfile in
Arrays einliest
und dann am Bilschirm ausgibt.
//---------------------------------------------------------------------------------------------
 
Du hast mit Sicherheit schon mal mit einem String vom Typ char* gearbeitet. Das ist ein Zeiger. Wenn du mit FILE* arbeitest, ist das auch ein Zeiger, und wenn du mit Arrays arbeitest, sind das auch Zeiger. Du siehst, so schwierig sind die gar nicht ;)

Wenn du mit fgets arbeitest, gibst du keine feste Länge an, sondern eine maximale Länge. Die Funktion hätte sonst keinen Sinn und wäre nichts weiter als ein Alias für fread. Wenn du Strings mit variabler Länge haben willst, könntest du einen Teil der Datei mit fread in einen Puffer einlesen und dann die Zeichen durchgehen und in Strings schreiben, deren Länge du dynamisch zunächst auf vielleicht 1024 Zeichen setzt und bei Bedarf vergrößerst (z.B. mit realloc). Wenn du dann an das Ende deines Eingabepuffers kommst, liest du den nächsten Teil der Datei ein und so weiter. Nicht so schlau wäre, die komplette Datei in den Puffer einlesen zu wollen, weil es ja auch sehr große Dateien gibt, die man nicht komplett in den RAM schreiben sollte.

Dein Puffer könnte so angelegt sein:
Code:
char *buffer ;
...
buffer = (char*)malloc( BUF_SIZE ) ;
Deine Strings legst du ebenso an. Wie du fread und den Puffer anwendest, liest du in MSDN oder deiner Onlinehilfe. Wie du Strings anzeigst, steht ebenfalls dort.

-Gawayn
 
Zuletzt bearbeitet:
Zurück