Как читать из текстового файла и загружать его в память, используя структуру? - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть такой текстовый файл:

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 голосов
/ 19 ноября 2018

Ваша проблема может быть в разборе ввода после чтения из файла.Я пишу решение, которое отлично работает в моей системе (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
0 голосов
/ 19 ноября 2018

Я думаю, я понял! Вы, ребята, думаете, что это нормально?

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

}

...