如何从文本文件中读取并使用结构将其加载到内存中?
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
我有一个这样的文本文件:
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