【问题标题】:How to read from text file and load it into memory using a struct?如何从文本文件中读取并使用结构将其加载到内存中?
【发布时间】:2018-11-19 05:15:46
【问题描述】:

我有一个像这样的文本文件:

Naruto, Wind, 85, 48, 35, 63
Neji, Fire, 57, 53, 81, 45
Gaara, Earth, 73, 47, 96, 50
Sasuke, Fire, 68, 82, 72, 41
Kankurou, Water, 59, 42, 97, 60

我有我的结构

typedef struct ninja{ 
    char* name; 
    char* element; 
    int ninjutsu ; 
    int genjutsu ; 
    int taijutsu ; 
    int defesa ; 
} Ninja ;

我需要读取文本文件并使用此结构将其直接加载到内存中。我应该创建一些数组,将信息按字符存储在 char 中,然后转换类型(当为 int 时)然后加载它?

void file(){
    FILE *file = fopen("ninjas.txt", "r");
    int c;
    if (file) {

       while ((c = getc(file)) != ','){
          putchar(c);
       }
       while ((c = getc(file)) != ','){
          putchar(c);
       }
       while ((c = getc(file)) != ','){
          putchar(c);
       }
       while ((c = getc(file)) != ','){
          putchar(c);
       }
       while ((c = getc(file)) != ','){
          putchar(c);
       }
       while ((c = getc(file)) != '\n'){
          putchar(c);
       }

   fclose(file);
}

}

【问题讨论】:

  • 请出示您的资料,以便我们提供建议。
  • 只是一个观察:每一行都是一个忍者,每个忍者都是链表的一个元素,但这部分我理解得很好。我只需要正确阅读即可。
  • 我只是想了解如何正确读取每个信息,而不是将其加载到内存中,我已经知道该怎么做。
  • 你应该澄清你所说的是什么意思“我总是把一些线路信息弄错”
  • 你可以使用这三个函数:fopenfgetsstrok

标签: c memory-management struct c99 ansi-c


【解决方案1】:

您的问题可能在于从文件读取后解析输入。我编写了一个在我的系统中完美运行的解决方案(使用 gcc 的 Ubantu)。 我使用 fgets() 方法读取一行,然后使用 strtok() 函数解析它。

这是代码。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_RECORD 100

    #define MAX_LINE 200
    typedef struct ninja{ 
        char* name; 
        char* element; 
        int ninjutsu ; 
        int genjutsu ; 
        int taijutsu ; 
        int defesa ; 
    } Ninja ;

        int main(int argc,char** argv){

                FILE *fptr=fopen("input.txt","r");
                if(fptr==NULL){
                printf("Error in openning file\n");
                return 1;
                }
                Ninja ninjas[MAX_RECORD];
                int total_record=0;
                char line_buffer[MAX_LINE];
                while(total_record< MAX_RECORD && fgets(line_buffer,MAX_LINE,fptr)!=NULL)
                {
                        char *curr_record=NULL;
                        curr_record=strtok(line_buffer,",");
                        ninjas[total_record].name=(char *)malloc(sizeof(char)*50);
                        strcpy(ninjas[total_record].name,curr_record);
                        curr_record=strtok(NULL,",");
                        ninjas[total_record].element=(char *)malloc(sizeof(char)*50);
                        strcpy(ninjas[total_record].element,curr_record);
                        curr_record=strtok(NULL,",");
                        ninjas[total_record].ninjutsu=atoi(curr_record);
                        curr_record=strtok(NULL,",");
                        ninjas[total_record].genjutsu=atoi(curr_record);
                        curr_record=strtok(NULL,",");
                        ninjas[total_record].taijutsu=atoi(curr_record);
                        curr_record=strtok(NULL,",");
                        ninjas[total_record].defesa=atoi(curr_record);
                        total_record++;
                }
                for(int i=0;i<total_record;i++)
                {
                        printf("%s %s %d %d %d %d",ninjas[i].name,ninjas[i].element,ninjas[i].ninjutsu,ninjas[i].genjutsu,ninjas[i].taijutsu,ni$
                        printf("\n");
                }
                fclose(fptr);
                return 0;
        }

输出:

Naruto  Wind 85 48 35 63
Neji  Fire 57 53 81 45
Gaara  Earth 73 47 96 50
Sasuke  Fire 68 82 72 41
Kankurou  Water 59 42 97 60

【讨论】:

  • 哇!那简直太完美了!我正在处理类似你的代码的东西,但是更混乱和多余哈哈,非常感谢!
  • @Susheel Dwivedi 为什么不使用 sscanf ?
  • 实际上 sscanf() 采用空格分隔的输入,并且您的文件在分隔符(",") 之后包含空格。如果您使用 sscanf() then ,也可以作为输入,并在使用 %d 或其他东西解析整数时给您带来麻烦。所以它是解析文件的安全方法:)。
【解决方案2】:

我想我明白了!大家觉得还可以吗?

void file(){
    FILE *file = fopen("ninjas.txt", "r");
    char str[60];
    const char s[3] = ", ";
    char *token;
    if (file) {
        while (fgets (str, 60, file) != NULL){
           token = strtok(str, s);
           printf( " %s\n", token );
           token = strtok(NULL, s);
           printf( " %s\n", token );
           token = strtok(NULL, s);
           printf( " %s\n", token );
           token = strtok(NULL, s);
           printf( " %s\n", token );
          token = strtok(NULL, s);
          printf( " %s\n", token );
          token = strtok(NULL, s);
          printf( " %s\n", token );
      }
  fclose(file);
  }

}

【讨论】:

    猜你喜欢
    • 2011-01-16
    • 2011-09-22
    • 2022-11-16
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多