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

C 从带有特殊字符的文件中读取链表,c,struct,C,Struct,我对运动有问题。我应该读取写入的文件,其中包含两个结构,第二个结构即产品应该在从文件中读取字符时停止读取,然后在结构之前开始读取,然后储存产品。你能帮我吗 我无法读取结构文件,然后使其停止到字符。 我想我需要两条法则,第一条法则是《结构》杂志的元素,第二条法则是《结构产品》的元素,并停留在人物身上 有人能写这样的代码吗 每个项目位于单独一行的文件,只有struct产品的行位于同一行: 货到付款名称数量 整体只被分割成一个空间 该文件的组织结构如下: ENG0002 高街8号 伦敦 英格兰 SCG

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


我无法读取结构文件,然后使其停止到字符。 我想我需要两条法则,第一条法则是《结构》杂志的元素,第二条法则是《结构产品》的元素,并停留在人物身上

有人能写这样的代码吗

每个项目位于单独一行的文件,只有struct产品的行位于同一行:

货到付款名称数量

整体只被分割成一个空间

该文件的组织结构如下:

ENG0002 高街8号 伦敦 英格兰 SCG8888短裤200 FFSF888衬衫200 TRA456456 公园道88号 伦敦 英格兰 ASDASD000短裤100 ADWC000衬衫1000 YUAYO鞋122


这是一个相当困难的解析问题,而fscanf不够复杂,因为fscanf将空格视为分隔符,因此无法读取带有嵌入空格的字符串。此外,如果你没有通过fscanf得到你想要的,很难说出你得到了什么

我会改用fgets。以下是我如何使用FGET阅读Magazino项目列表:

请注意,fgets将回车保留在字符串的末尾,因此需要将其修剪掉。还要注意,我将结构magazzino作为指向指针的指针传递给这个函数-结构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;
        }
    }
}

提示:行m->next;什么也不做。阅读。LeggiProdotto函数没有做任何有用的事情,但是你无论如何也不会调用它。而且你不会丢失你打开的文件。可能还有更多的问题。哦,是的,你忘了提到你实际上有哪些问题。我无法从文件中读取结构,然后让它停止到角色
struct magazzino *mag;
read_magazzino(&mag);
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;
        }
    }
}