2017-02-17 5 views
0

ich ein Problem mit einer Übung haben. Ich sollte die geschriebene Datei lesen, die zwei Strukturen enthält, die zweite Struktur, die das Produkt ist, sollte aufhören zu lesen, wenn Sie das Zeichen aus der Datei lesen, und dann beginnen, vor der Struktur zu lesen und dann das Produkt auf Lager. Kannst du mir helfen?lesen verknüpfte Liste aus der Datei mit Sonderzeichen #

Ich kann nicht von der Struktur-Datei lesen und es dann auf das Zeichen # stoppen. Ich denke, ich brauche zwei, wo, wo das erste Gesetz die Elemente von struct Magazin, und das zweite Gesetz von diesen Struct Produkt und Stop bei der Zeichen #.

Gibt es jemanden, Code wie diesen schreiben könnte?

Die Datei mit einem Element auf einer separaten Zeile, wird nur die Zeile des struct Produkt ist auf der gleichen Linie:

(Cod_p Name Menge)

die ganze nur getrennt ist ein Leerzeichen.

die Datei ist wie folgt aufgebaut:

ENG0002
High Street, 8
London
England
SCG8888 Shorts 200
FFSF888 Hemd 200
#
TRA456456
Park Straße , 88
London
England
ASDASD000 Shorts 100
ADWC000 Shirt 1000
YUAYO Schuhe 122
#


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

struct magazine { 
    char cod_m[30]; 
    char adress[30]; 
    char city[30]; 
    char nation[30]; 
    struct product* p; 
    struct magazine* next; 
    `` 
}; 

struct product { 
    char cod_p[10]; 
    char name[20]; 
    int quantity; 
    struct product* next; 
}; 

void read_st(struct magazzino* m); 

int main() { 
    struct magazzino* mag; 
    read_st(mag); 
} 

void read_st(struct magazzino* m) { 
    FILE* fp; 
    fp = fopen("magazzino.txt", "r"); 

    while (!feof(fp)) { 
     struct magazzino* m = (struct magazzino*)malloc(sizeof(struct magazzino)); 
     fscanf(fp, "%s\n%s\n%s\n%s\n", &m->cod_m, &m->adress, &m->city, &m->nation); 
     m->next; 
     printf("%s\n%s\n%s\n%s\n", &m->cod_m, &m->adress, &m->city, &m->nation); 
    } 
} 

struct prodotto* LeggiProdotto(char filename) { 
    FILE* fp = fopen("magazzino.txt", "r"); 
    while (!feof(fp)) { 
     struct prodotto* p = (struct prodotto*)malloc(sizeof(struct prodotto)); 
    } 
} 
+1

Hinweise: Die Linie 'm-> weiter;' tut nichts. Und lesen [this] (http://stackoverflow.com/questions/5431941/why-is-which-feof-file-always-wrong). Und die 'LeggiProdotto'-Funktion macht nichts Sinnvolles, aber Sie rufen es trotzdem nicht an. Und Sie "schließen" nicht die Dateien, die Sie geöffnet haben. Es gibt wahrscheinlich mehr Probleme. –

+2

Oh ja, und du vergisst zu erwähnen, welche Probleme du tatsächlich hast. –

+0

Ich kann nicht aus der Struktur aus der Datei lesen, und dann lassen Sie es auf das Zeichen # stoppen – ilbranco

Antwort

1

Dies ist ein ziemlich schwieriges Problem analysierende und fscanf() ist für sie nicht anspruchsvoll genug , weil fscanf() Leerzeichen als Trennzeichen behandelt und daher keine Zeichenfolgen mit eingebetteten Leerzeichen lesen kann. Wenn Sie mit fscanf nicht bekommen, was Sie wollen, ist es schwierig zu sagen, was Sie bekommen haben.

Ich würde stattdessen fgets() verwenden. Hier ist, wie ich würde die Liste der magazzino Artikel lesen fgets() mit:

void rtrim(char *str) 
{ 
    str[strcspn(str, "\r\n")] = '\0'; 
} 

void read_magazzino(struct magazzino **m) 
{ 
    FILE* fp; 
    int finished = 0; 
    char buf[30]; 
    fp = fopen("magazzino.txt", "r"); 

    while (!finished) { 
     char *read = fgets(buf, 30, fp); 
     if (read != NULL && buf[0] != '\0') { 
      *m = malloc(sizeof(struct magazzino));  
      strcpy((*m)->cod_m, buf); 
      rtrim((*m)->cod_m); 
      fgets((*m)->adress, 30, fp); 
      rtrim((*m)->adress); 
      fgets((*m)->city, 30, fp); 
      rtrim((*m)->city); 
      fgets((*m)->nation, 30, fp); 
      rtrim((*m)->nation); 
      read_prodotto(fp, &(*m)->p); 
      m = &(*m)->next; 
     } 
     else { 
      *m = NULL; 
      finished = 1; 
     } 
    } 
    fclose (fp); 
} 

Beachten Sie, dass fgets() verlässt den Wagenrücklauf am Ende der Zeichenfolge, so dass Sie es weg trimmen müssen. Beachten Sie auch, dass ich die struct magazzino an diese Funktion als Zeiger auf einen Zeiger übergeben habe - struct magazzino **. Wenn Sie es einfach als Zeiger senden, würde das bedeuten, dass die Variable dafür in main() nicht von der Erstellung der Liste betroffen wäre.Hier ist, wie ich es von main() genannt, die Adresse der Variable übergeben Sie einen Zeiger auf einen Zeiger zu machen:

struct magazzino *mag; 
read_magazzino(&mag); 

die Produkte zu lesen, würde ich weiterhin fgets() verwenden. Wir können nach dem Zeichen im Puffer suchen, wenn wir jede Zeile lesen. Um die Produktfelder aus der Zeile zu extrahieren, habe ich sscanf() verwendet, was ähnlich wie fscanf() ist, da es eine Formatzeichenfolge benötigt. Unter der Annahme, dass die Produktnamen keine Leerzeichen enthalten, sollte dies in Ordnung sein.

void read_prodotto(FILE *fp, struct prodotto **p) 
{ 
    char buf[60]; 
    int finished = 0; 
    while (!finished) { 
     fgets(buf, 60, fp); 
     if (buf[0] != '#') { 
      *p = malloc(sizeof(struct prodotto)); 
      sscanf(buf, "%s%s%d", (*p)->cod_p, (*p)->name, &(*p)->quantity); 
      p = &(*p)->next; 
     } 
     else { 
      *p = NULL; 
      finished = 1; 
     } 
    } 
}