2017-02-17 8 views
0

У меня возникла проблема с упражнением. Я должен прочитать записанный файл, который содержит две структуры друг друга, вторая структура, которая является продуктом, должна перестать читать при чтении символа # из файла, а затем начать чтение перед структурой, а затем запасти продукт. Вы можете мне помочь?Прочтите связанный список из файла со специальными символами #

Я не могу прочитать из файла структуры, а затем остановить его до символа #. Мне кажется, что мне нужно два, в то время как первый закон - это элементы журнала структуры, а второй закон этого продукта структуры и остановка у символа #.

Есть ли кто-нибудь, кто мог бы написать такой код?

Файл с каждым элементом на отдельной строке, только линия STRUCT продукта находится на той же линии:

(Cod_p количество имя)

целое только отделил пространство.

файл организован следующим образом:

ENG0002
улица, 8
Лондон
Англия
SCG8888 шорты 200
FFSF888 рубашка 200
#
TRA456456
Park Road , 88
Лондон
Англия
ASDASD000 шорты 100
ADWC000 рубашки 1000
YUAYO обувь 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

Подсказки: строка 'm-> next;' ничего не делает. И прочитайте [this] (http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong). И функция «LeggiProdotto» не делает ничего полезного, но вы все равно не называете это. И вы не 'fclose' файлы, которые вы' fopen'ed. Есть, вероятно, больше проблем. –

+2

О да, и вы забыли упомянуть, какие проблемы у вас на самом деле есть. –

+0

Я не могу прочитать из структуры из файла, а затем заставить его остановить символ # – ilbranco

ответ

1

Это довольно сложная задача синтаксического анализа, и fscanf() не достаточно сложные для него , потому что fscanf() рассматривает пробелы как разделитель и поэтому не может читать строки со встроенными пространствами. Кроме того, если вы не получите то, что хотите, с fscanf, сложно сказать, что вы получили.

Вместо этого я бы использовал fgets(). Вот как я прочитал бы список magazzino элементов с помощью fgets():

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); 
} 

Обратите внимание, что fgets() оставляет возврат каретки на конце строки, так что вам нужно, чтобы обрезать его. Также обратите внимание, что я передал struct magazzino этой функции в качестве указателя на указатель - struct magazzino **. Просто отправка его в качестве указателя означает, что переменная для нее в main() не будет затронута созданием списка.Вот как я назвал его из main(), передавая адрес переменной, чтобы сделать его указатель на указатель:

struct magazzino *mag; 
read_magazzino(&mag); 

Чтобы прочитать продукты, я буду продолжать использовать fgets(). Мы можем проверить символ # в буфере, когда мы читаем каждую строку. Чтобы извлечь поля продукта из строки, я использовал sscanf(), который похож на fscanf() тем, что он принимает строку формата. Если в названиях продуктов нет пробелов, это должно быть хорошо.

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; 
     } 
    } 
}