c - 如何从文本文件 (C) 中读取特定数据?

标签 c input file-io

我对 C(以及这个网站)有些陌生,对我正在从事的项目有疑问。我坚持的部分是文件 I/O 的东西,因为我在上一节课中从未学过这部分。因此,输入 (.txt) 文件如下所示:

REGISTERS
R5 11
R7 15
R21 4
MEMORY
4 12
12 92
[OTHER STUFF]

该文件为我们提供了任意寄存器编号,然后是其内容(R0 到 31,省略了值为 0 的寄存器)。下一节以类似的格式给出了内存位置,然后是内容。然后是我稍后可以处理的更多部分。

我的问题是:如何读取寄存器/内存位置及其值?目前我有一个大小为 32 的数组来存储内容和一个用于寄存器编号和值的变量(示例:Registers[regNumber] = regValue;),但我不知道如何在 REGISTERS 一词后开始正确读取值。

我尝试过的:

我环顾四周,设法读入了只有一行的测试输入文件:“R5 11”。为此我做了:

fscanf(file_ptr, "R%d %d", &regNumber, &regValue);

我打印了变量 regNumber、regValue,它们正确地给了我 5 和 11。但是我如何对 REGISTERS 一词后的任意行数执行此操作并在 MEMORY 一词处停止?

我假设无论解决方案是什么,我都可以做同样的事情来读取 MEMORY 位置和值。

最佳答案

您可以使用 fgets() 读取整行文本文件,然后使用 strcmp 或 strncmp 读取“REGISTERS”和“MEMORY”字符串文字的行。

您的 input.txt 格式的方式“REGISTERS”之后的所有内容都具有相同的格式,直到“MEMORY”,以及“MEMORY”之后的所有内容都是相同的格式。也许像下面这样的东西会起作用,尽管可能有更好的选择:

int main () {
   FILE *fp;
   char str[60];
   int input_type = 0; //you can enum this for the input types you have
   int line_num = 0;

   /* opening file for reading */
   fp = fopen("input.txt" , "r");
   if(fp == NULL) {
      perror("Error opening file");
      return(-1);
   }
   while( fgets (str, 60, fp)!=NULL ) { // dont really need the != NULL compare here.
      line_num++;
      /* Parse the next line in the file */
      if(strcmp(str,"MEMORY") == 0){
         //the next lines will be formatted like memory input lines
         input_type = 2; //This should be an enum or macro
         continue;
      }
      if(strcmp(str,"REGISTERS") == 0){
         //the next lines will be formatted like register input lines
         input_type = 1;//Also should be enum or macro
         continue;
      }
      switch(input_type){
         case 0:
            fprintf(stderr,"Failed to find REGISTER keyword%d\n",line_num);
            break;
         case 1:
            sscanf(str, "R%d %d", &regNumber, &regValue); //parse known string format
            do_something(&regNumber, &regValue);
            break;
         case 2:
            sscanf(str, "%d %d", &memNumber, &memValue); //parse known string format
            do_something_else(&memNumber, &memValue);
            break;
         default:
            fprintf(stderr,"Could not find input format at line %d\n",line_num);
            break;
      }
   }
   fclose(fp);

   return(0);
}

关于c - 如何从文本文件 (C) 中读取特定数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50033017/

相关文章:

python - 我正在编写一个程序将文件复制到另一个目录中,但复制的名称不一样

php - fopen 前面有/没有@

c - 如何修复 Parasoft 检查的错误

c - 在 C 中实现类似 shell 的作业控制

java - 在 Windows 上的 Java 中检查文件是否为空的最有效方法

java - 错误整数自定义值Java

jquery - 我可以引用输入:text as an #id?吗

c - 理解太小类型的移位操作

C - 给定数组中指定元素的最长子数组

c - 如何在输入的同一行上打印输出?