gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:00:08 26 4
gpt4 key购买 nike

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

我无法从结构文件中读取,然后使其停止到字符#。我想我需要两个,其中第一条定律是结构杂志的元素,第二条定律是那些结构积并停在字符 # 处。

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

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

(Cod_p name quantity)

整体仅以空格分隔。

文件的组织方式如下:

ENG0002
high street,8
London
England
SCG8888 Shorts 200
FFSF888 shirt 200
#
TRA456456
Park road,88
London
England
ASDASD000 shorts 100
ADWC000 shirt 1000
YUAYO shoes 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;
}
}
}

关于c - 从文件中读取带有特殊字符的链表#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42301569/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com