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