2016-06-11 24 views
-1

Lesen habe ich eine ListeC eine Datei dynamische Liste, dynamische Zeichenfolge

typedef struct LISTA lista; 
struct LISTA 
{ 
    char *linia; 
    int numer; 
    struct lista *next; 
}; 

Ad Ich brauche eine TXT-Datei zu erhalten, mit unbekannten Längen der Linien, um sie gespeichert haben. Mit "linia" ist die Linie dynamisch malloc() -ed zu ihm, und "numer" ist eine Nummer der Linie.

Ich habe versucht, es zu arbeiten, indem ich es durch Char lesen, aber mit meinem begrenzten Wissen in C habe ich mich sehr schnell darin verwickelt. Ich habe hier mehrere Lösungen gefunden, aber die meisten hatten das eine oder andere Problem, einige waren extrem kompliziert und ich konnte nicht verstehen, was es tat, und anderen fehlte das '\ 0' am Ende der Zeichenfolge.

Ich wäre wirklich froh mit einem Beispiel und einer Erklärung, was es tut und wie. Ich möchte es wirklich lernen, nicht nur diese blöde Aufgabe zu beenden

Die eigentliche Aufgabe ist ein grep-ähnliches Programm in C, aber ich denke, ich kann den Rest der Mechanik fertig, ich bin ratlos auf Speichern aller zu eine dynamische Liste.

+2

Dies ist kein Kodierungsdienst. Beachten Sie, dass nur Großbuchstaben für Makros und Enum-Konstanten verwendet werden sollten. Auch C unterscheidet zwischen Groß- und Kleinschreibung. Wenn Sie einfach ein Muster mit der Deklaration 'typedef' und' struct' kopieren, sollten Sie die Konzepte lernen. Sonst wirst du nirgends programmieren. – Olaf

Antwort

0

Siehe Code unten. Es liest Textdatei in eine dynamische Liste, dynamische Zeichenfolge. char * getLineOfAnySize(FILE* fp, size_t typicalSize, int *endOfLineDetected); ist hier entscheidend.

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

struct list 
{ 
    char *linia; 
    int numer; 
    struct list *next; 
}; 

typedef struct list LIST; 

char * getLineOfAnySize(FILE* fp, size_t typicalSize, int *endOfLineDetected,size_t *nrOfCharRead){ 
    char *line;  // buffer for our string 
    int ch;   // we will read line character by character 
    size_t len = 0; // number of characters read (character counter) 
    size_t lineSize = typicalSize; // initial size of the buffer allocated for the line 
    *nrOfCharRead = 0; 

    if(!fp) return NULL; // protection 

    // allocating the buffer 
    line = realloc(NULL, sizeof(char)*lineSize); // expected size of the line is up to typicalSize 

    if (!line) return line; // protection, if we fail to allocate the memory we will return NULL 

    while (1) { // loop forever  
     ch = fgetc(fp);  // getting character by character from file 

     if (ch == '\n') break; // end of line detected - breaking the loop 
     if(ch == EOF) { 
      *endOfLineDetected = 1; 
      break; // end of file detected - breaking the loop 
     } 

     line[len++] = ch;  // store the character in the line buffer, increase character counter 

     if (len == lineSize){ // we reached the end of line buffer (no more room) 

     lineSize = lineSize + 64; // we have to increase the line size 
     line = realloc(line, sizeof(char)*(lineSize)); // line buffer has new size now 

     if (!line) return line; // if we fail to allocate memory we will return NULL 
     } 
    } 

    if((len == 0) && *endOfLineDetected) return NULL; // empty file 

    line[len++] ='\0'; // ending the string (notice there is no '\n' in the string) 
    *nrOfCharRead = len; 

    return line;  // return the string 
} 

int main(void) 
{ 
    FILE *fp = NULL; // file handle 
    char *line; // 
    int endOfLineDetected = 0; 
    size_t nrOfCharRead = 0; 

    LIST *current, *head; // pointers to list elements 

    head = current = NULL; // init to NULL 

    fp = fopen("document.txt", "r"); // open file for reading 
    int nr = 0; 

    while(line = getLineOfAnySize(fp,128,&endOfLineDetected,&nrOfCharRead)){ // read the file 

     if((nrOfCharRead == 0) && endOfLineDetected) break;    

     // create new list element 

     LIST *node = malloc (sizeof(LIST)); 

     nr = nr + 1; 
     node->linia = line; // initialize the linia 
     node->numer = nr;  // update the line number 

     node->next = NULL; // next element do not exist yet 

     if(head == NULL) 
     { 
      current = head = node; 
     } else 
     { 
      current = current->next = node; 
     } 

     if (endOfLineDetected) break; 
    } 

    if (fp) fclose(fp); // remember to close the file 

    //print, go via all elements of the list till you get NULL next element 
    for(current = head; current ; current=current->next){ 
     printf("line nr=%d line= %s",current->numer, current->linia); 
    } 
    return 0; 
} 
+0

danke! Es ist sogar mehr, als ich erwartet habe. Genau das habe ich gebraucht und noch mehr. Ich sollte meine eigene Version machen können. – markoatonc