使用特殊字符从文件中读取链接列表#

时间:2017-02-17 15:25:14

标签: c struct

我的运动有问题。我应该读取写入的文件,其中包含两个结构,另一个结构是产品在从文件中读取#字符时应该停止读取,然后在结构之前开始读取然后存储产品。你能救我吗?

我无法从struct文件中读取,然后让它停止到字符#。 我认为我需要两个,而第一个法则是结构杂志的元素,以及那些结构产品的第二个定律并停在角色#。

是否有人可以编写这样的代码?

每个项目在一个单独的行上的文件,只有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 个答案:

答案 0 :(得分: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;
        }
    }
}