簡體   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