使用 C 中的 fgets 和 strtok 读取文件并将信息保存在喜欢的列表中
Reading file and save information in a liked list using fgets and strtok in C
我正在尝试读取一个只有一行名称以逗号分隔的文件,所以我使用 fgets 读取该行,然后使用 strtok 分隔名称,然后我想将这些名称保存在一个链表。我正在使用 CodeBlocks,当我 运行 程序时,它显示此消息:"Process terminated with status -1073741510"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#define MAX_CHAR 200
typedef struct Names{
char* name;
struct Names* next;
}Names;
Names* create_list(){
Names* aux = (Names*) malloc (sizeof(Names));
assert(aux);
aux->next = NULL;
return aux;
}
void insert_name (Names* n, char* p){
Names* aux = (Names*)malloc(sizeof(Names));
aux->name = p;
while(n->next!=NULL){
n=n->next;
}
aux->next=n->next;
n->next=aux;
}
void config(Names*p){
FILE* fp = fopen( "names.txt", "r");
if(fp == NULL){
printf("Error opening file");
return;
}
else{
char line[MAX_CHAR],*token;
fgets(line, MAX_CHAR, fp);
token = strtok(line,",");
insert_name(p,token);
while(token != NULL);{
token = strtok(NULL,",");
insert_name(p,token);
}
fclose(fp);
}
}
void print_list(Names* n){
Names* l = n->next;
while (l){
printf("%s\n",l->name);
l = l -> next;
}
}
int main()
{
Names* n;
n = create_list();
config(n);
print_list(n);
return 0;
}
这里有一个无限循环:
while(token != NULL);{
分号终止了 while
的 "body" 并且花括号只是打开了一个未附加到任何控制结构的代码块。 (这是合法的,并且是在 C99 之前限定变量范围的一种方式。)
没有分号,循环仍然是错误的:只有在知道令牌不是 NULL
时才应该插入:
token = strtok(line,",");
while (token != NULL) {
insert_name(p,token);
token = strtok(NULL,",");
}
您的代码仍有错误:
- 您的标记是指向本地数组“line
. When you leave
config, these pointers become invalid, because
line”的指针,将变得无效。您应该复制字符串而不是只存储一个指针。
- 在程序结束时,您应该为每次调用
malloc
调用 free
。换句话说,清理你的清单。
我认为首先你需要修改 name 分配给 strcpy 或 memcpy 并且还使用动态分配
aux->name = (char*) malloc(strlen(p));
strcpy(aux->name, p);
或
typedef struct Names{
char name[MAX_NAME_LEN];
struct Names* next;
}Names;
//and use strcpy or memcpy in insert_name function
希望这会有所帮助。
我正在尝试读取一个只有一行名称以逗号分隔的文件,所以我使用 fgets 读取该行,然后使用 strtok 分隔名称,然后我想将这些名称保存在一个链表。我正在使用 CodeBlocks,当我 运行 程序时,它显示此消息:"Process terminated with status -1073741510"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#define MAX_CHAR 200
typedef struct Names{
char* name;
struct Names* next;
}Names;
Names* create_list(){
Names* aux = (Names*) malloc (sizeof(Names));
assert(aux);
aux->next = NULL;
return aux;
}
void insert_name (Names* n, char* p){
Names* aux = (Names*)malloc(sizeof(Names));
aux->name = p;
while(n->next!=NULL){
n=n->next;
}
aux->next=n->next;
n->next=aux;
}
void config(Names*p){
FILE* fp = fopen( "names.txt", "r");
if(fp == NULL){
printf("Error opening file");
return;
}
else{
char line[MAX_CHAR],*token;
fgets(line, MAX_CHAR, fp);
token = strtok(line,",");
insert_name(p,token);
while(token != NULL);{
token = strtok(NULL,",");
insert_name(p,token);
}
fclose(fp);
}
}
void print_list(Names* n){
Names* l = n->next;
while (l){
printf("%s\n",l->name);
l = l -> next;
}
}
int main()
{
Names* n;
n = create_list();
config(n);
print_list(n);
return 0;
}
这里有一个无限循环:
while(token != NULL);{
分号终止了 while
的 "body" 并且花括号只是打开了一个未附加到任何控制结构的代码块。 (这是合法的,并且是在 C99 之前限定变量范围的一种方式。)
没有分号,循环仍然是错误的:只有在知道令牌不是 NULL
时才应该插入:
token = strtok(line,",");
while (token != NULL) {
insert_name(p,token);
token = strtok(NULL,",");
}
您的代码仍有错误:
- 您的标记是指向本地数组“line
. When you leave
config, these pointers become invalid, because
line”的指针,将变得无效。您应该复制字符串而不是只存储一个指针。 - 在程序结束时,您应该为每次调用
malloc
调用free
。换句话说,清理你的清单。
我认为首先你需要修改 name 分配给 strcpy 或 memcpy 并且还使用动态分配
aux->name = (char*) malloc(strlen(p));
strcpy(aux->name, p);
或
typedef struct Names{
char name[MAX_NAME_LEN];
struct Names* next;
}Names;
//and use strcpy or memcpy in insert_name function
希望这会有所帮助。