2017-02-17 41 views
0

我有練習題。我應該讀取包含兩個結構的寫入文件,當從文件中讀取#字符時,產品的第二個結構應該停止讀取,然後在結構之前開始讀取,然後存儲產品。你可以幫我嗎?從帶有特殊字符的文件中讀取鏈接列表#

我無法從結構文件讀取數據,然後將其停止爲#字符。 我想我需要兩個while第一個法則struct elements的元素,以及那些struct product的第二個法則,並且停止在字符#處。

有沒有人可以這樣寫代碼?

與在單獨的行的每個項目的文件中,僅結構產品的線是在同一行上:

(Cod_p名稱量)

整個僅分離空間。

文件的組織結構如下:

ENG0002
高街,8
倫敦
英格蘭
SCG8888短褲200
FFSF888襯衫200

TRA456456
公園路,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'你打開的文件。可能有更多的問題。 –

+2

哦,是的,你忘了提到你實際上有哪些問題。 –

+0

我無法從文件中讀取結構,然後將其停止到字符# – ilbranco

回答

1

這是一個相當困難的分析問題,fscanf()並不複雜足以使它,因爲fscanf()將空白視爲分隔符,因此不能讀取帶有嵌入空格的字符串。另外,如果你沒有得到你想要的fscanf,很難說你得到了什麼。

我會用fgets()代替。下面是我將如何使用fgets()magazzino項的列表:

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; 
     } 
    } 
} 
相關問題