如何使用结构从文本文件读取并将其加载到内存中?

时间:2018-11-19 05:15:47

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

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

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将信息存储在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);
}

}

2 个答案:

答案 0 :(得分:0)

我想我明白了!你们觉得还好吗?

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

}

答案 1 :(得分:0)

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