首页 > 解决方案 > 如何从文本文件中读取并使用结构将其加载到内存中?

问题描述

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

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 by 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);
}

}

标签: cmemory-managementstructc99ansi-c

解决方案


您的问题可能在于从文件读取后解析输入。我编写了一个在我的系统中完美运行的解决方案(使用 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

推荐阅读