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 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);
}
}
解决方案
您的问题可能在于从文件读取后解析输入。我编写了一个在我的系统中完美运行的解决方案(使用 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
推荐阅读
- multithreading - 带有 FFTW 的 fftwf_plan_dft_1d( ... ) 无法执行
- haproxy - Filebeat 无法通过 haproxy 将日志发送到 logzio
- c# - 访问异步调用的结果是否使其同步?
- excel - (Excel VBA)插入复选框(OKAY)并将它们链接到单独工作表中的单元格(不是OKAY)
- asp.net - 对于 asp.net 应用程序,单个 iis 托管 2 个应用程序的不同会话 ID
- android - 如何让第三方应用程序(Gmail/Email/Message/WhatsApp)回复我们的应用程序
- php - 如何在 morris.js 中修复 x 轴的周期?
- tensorflow - 我的测试图像是否也需要预处理?
- passwordvault - 如何在cyberark密码库中为应用程序创建帐户
- mysql - 如何根据外键值有条件地将数据插入表中?