如何将文件中的特定信息读入结构

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;

【问题讨论】:

Why while(!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*

意思是,我们用逗号分隔每个元素。如果您的 questionanswer 元素包含逗号,这可能是一个问题。在这种情况下,只需找到像|,\ 这样不太可能出现在您的questionanswer 中的符号。我们将用于演示示例的文件是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?

【讨论】:

文件格式是问题的一部分。您无法想象一款适合您需求的新产品。修改您的代码以遵循问题。

以上是关于如何将文件中的特定信息读入结构的主要内容,如果未能解决你的问题,请参考以下文章

如何在MATLAB中读入多个音频文件啊?

Spark UDF:如何在每一行上编写一个 UDF 以提取嵌套结构中的特定值?

如何将文件内容读入批处理文件中的变量?

Excel 控件中的checkbox 如何被选中? 为啥不是像"窗体"中的复选框一样,拉出来,直接用鼠标单击就能选中了

c语言中如何将按结构体中的某个元素大小,将结构体排序输出

如何将文件内容读入 istringstream?