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

标签 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 ;

我需要读取文本文件并使用此结构将其直接加载到内存中。我应该创建一些数组,将信息逐个存储在内部,然后转换类型(当为 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);
}

}

最佳答案

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

关于c - 如何使用结构从文本文件中读取并将其加载到内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53368695/

相关文章:

c - 147次递归调用后,发生段错误。 (在C中)

c++ - Windows 10 是否会防止您访问其他程序正在使用的内存?

c# - 通用约束,其中 T : struct and where T : class

c - C 中的 Do-While 循环

c - cublas 应该被 atlas 超越吗?

memory-leaks - 没有 GDI 泄漏的 VB6 内存泄漏

c# - 在循环内部与外部定义变量

c - 发送指向外部函数的指针使其为空后,它不会变为空

c++ - 如何使用 std::allocator_traits::construct 从函数参数创建结构对象?

c - 在 Windows 8 上使用 C 读取引导扇区