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

How to read from text file and load it into memory using a struct?

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

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

}

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

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

}

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