我的运动有问题。我应该读取写入的文件,其中包含两个结构,另一个结构是产品在从文件中读取#
字符时应该停止读取,然后在结构之前开始读取然后存储产品。你能救我吗?
我无法从struct文件中读取,然后让它停止到字符#。 我认为我需要两个,而第一个法则是结构杂志的元素,以及那些结构产品的第二个定律并停在角色#。
是否有人可以编写这样的代码?
每个项目在一个单独的行上的文件,只有struct product的行在同一行:
(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));
}
}
答案 0 :(得分:1)
这是一个非常困难的解析问题,fscanf()
对它来说不够复杂,因为fscanf()
将空格视为分隔符,因此无法读取带有嵌入空格的字符串。此外,如果你没有得到你想要的fscanf
,你很难说你得到了什么。
我会改用fgets()
。以下是我使用magazzino
阅读fgets()
项列表的方法:
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;
}
}
}