如何将文件中的特定信息读入结构
Posted
技术标签:
【中文标题】如何将文件中的特定信息读入结构【英文标题】:How to read specific information from a file into a structure 【发布时间】:2021-09-22 17:39:09 【问题描述】:我有一个名为 question.txt 的 .txt 文件,其中包含以下格式的多项选择题和多个答案:
**X question content
# Answer 1
# Answer 2
...
# Answer n
X 是一个整数(问题所在章节的编号)
n 小于或等于 5
我正在尝试提取关于章节号 (X) 的信息、问题内容和所述问题的答案,并将它们存储到一个结构变量中,就像这样
struct
int chapter;
int qcontent[512];
char answer[5][256];
以下是我的尝试,我想知道是否有不同的方法,也许是更紧凑的方法?
#include <stdio.h>
typedef struct
int chapter;
char qcontent[512];
char answer[5][256];
question;
int main()
question question[100];
FILE *fp = fopen("question.txt", "r");
char fline[512];
int i = -1; // Count question
int j = 0; // Count answer in a question
while (!feof(fp))
fgets(fline, 512, fp);
fline[strlen(fline) - 1] = 0;
if (strstr(fline, "**"))
++i;
question[i].chapter = fline[2] - '0';
strcpy(question[i].qcontent, fline + 4);
j = 0;
if (strstr(fline, "#"))
strcpy(question[i].answer[j++], fline + 2);
return 0;
【问题讨论】:
Whywhile(!feof(file))
is always wrong
question
结构中没有 group
成员。你的意思是question[i].chapter
?
fline[2] - '0'
如果章节号可以超过 1 位数,则将不起作用。
你缺少
,所以你在循环中有return 0;
,它在处理文件的第一行后返回。
【参考方案1】:
注意:您提供的代码中有很多错误。但是,我将演示一种处理此类情况的方法。
首先,您需要知道结构信息是如何保存在文件中的。可以说,我们有以下格式。
chapter, question, ans1, ans2, ans3, ans4, ans5
datatype: int, char*, char*, char*, char*, char*, char*
意思是,我们用逗号分隔每个元素。如果您的 question
或 answer
元素包含逗号,这可能是一个问题。在这种情况下,只需找到像|,\
这样不太可能出现在您的question
或answer
中的符号。我们将用于演示示例的文件是this
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct
int chapter;
char qcontent[512];
char answer[5][256];
question;
int main()
question question[100];
FILE *file = fopen("question.txt","r");
char buffer[2048];
memset(buffer, 2048, 0); // initializing the buffer with 0, its always a good practice to initialize.
int i=0;
while(fgets(buffer, 2048, file)!=NULL)
// atoi() = ascii to integer, a function frob stdlib.h
question[i].chapter = atoi(strtok(buffer, "\n,"));
strcpy(question[i].qcontent, strtok(NULL, ","));
for(int j=0; j<4; j++)
strcpy(question[i].answer[j], strtok(NULL, ","));
// The last string will have a \n next to it, so-
strcpy(question[i].answer[4], strtok(NULL, ",\n"));
i++;
for(int index=0; index<i; index++)
printf("Question on chapter %d:\n",question[index].chapter);
printf("%s\n",question[index].qcontent);
printf("Answers:\n");
for(int j=0; j<5; j++) printf("%s\n",question[index].answer[j]);
return 0;
你会在屏幕上看到这个output。
您可以在此处了解更多信息。
How to read/write 2D array from file?
How does strtok() work?
How does fgets() work?
How does atoi() work?
【讨论】:
文件格式是问题的一部分。您无法想象一款适合您需求的新产品。修改您的代码以遵循问题。以上是关于如何将文件中的特定信息读入结构的主要内容,如果未能解决你的问题,请参考以下文章
Spark UDF:如何在每一行上编写一个 UDF 以提取嵌套结构中的特定值?