[英]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.