繁体   English   中英

从文件中读取带有特殊字符的链表#

[英]Read linked list from file with a special characters #

我做运动有问题。 我应该阅读包含两个结构的书面文件,当从文件中读取#字符时,作为产品的第二个结构应停止读取,然后在该结构之前开始读取,然后库存产品。 你能帮助我吗?

我无法从结构文件中读取,然后使它停止到字符#。 我想我需要两个时间,第一个定律是struct杂志的元素,第二个定律是结构乘积并停在字符#上。

有没有人可以写这样的代码?

每个项目都在单独的行上的文件,只有struct产品的行在同一行:

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

这是一个相当困难的解析问题,并且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;
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM