2017-02-17 69 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; 
     } 
    } 
}