使用 scanf 和 do while 循环读取文件
Reading a file with scanf and a do while loop
我正在使用 scanf
读取文件。每行只是一个数据字段,所以我有一个 do while 循环。基本上我所做的是,阅读构建根目录的第一条信息(我用它来构建 BST)。但是当进入内部时。读奇怪的东西。读取并创建正确的所有数据,但对于循环的每次迭代,调用两次相同的方法来读取文件,我不知道现在发生了什么。
comp_node_ptr read_competitor_node(int id, FILE * competitor_filename){
int scan_status;
int feet;
double inches;
competitor_node * tmp_node;
tmp_node = calloc(1, sizeof(tmp_node));
scan_status = fscanf(competitor_filename, "%[^\n]\n", tmp_node -> name );
if(scan_status == EOF){
printf("End Of File. \n");
free(tmp_node);
return NULL;
}
tmp_node -> id = id;
fscanf(competitor_filename, "%[^\n]\n", tmp_node -> addres );
fscanf(competitor_filename, "%[^\n]\n", tmp_node -> phone_number );
fscanf(competitor_filename, "%d %lf", &feet, &inches );
tmp_node -> cucumber = convertToInches(feet, inches);
fscanf(competitor_filename, "%d %lf", &feet, &inches );
tmp_node ->carrot = convertToInches(feet, inches);
fscanf(competitor_filename, "%d %lf", &feet, &inches );
tmp_node -> bean = convertToInches(feet, inches);
printNode(tmp_node);
return tmp_node;
}
root = read_competitor_node(id, competitor_table_file);
do{
id++;
tmp_node = read_competitor_node(id, competitor_table_file);
add_competitor(root, tmp_node);
}while(tmp_node != NULL);
并打印以下数据:
Margaret Mouse 1 Southern 9565 1 ft -0.500000 in 2 ft -3.200001 in 1 ft -4.500000 in -134217728 ft 0.000000 in
2 1 ft -4.500000 in 1 ft -4.500000 in 1 ft -4.500000 in 0 ft 0.000000 in
Bert Hill 3 Central 2010 1 ft -7.200001 in 1 ft -8.200001 in 2 ft -11.700001 in 156587349 ft -4.000000 in
4 � 27263573 ft -4.000000 in 27263573 ft -4.000000 in 27263573 ft -4.000000 in 0 ft 0.000000 in
Donald Duck 5 Marine 1234567 2 ft -0.400000 in 2 ft -4.500000 in 1 ft -6.200001 in 145402538 ft -8.000000 in
6 � 27263570 ft -8.000000 in 27263570 ft -8.000000 in 27263570 ft -8.000000 in -67108864 ft 0.000000 in
End Of File.
2、4 和 6 我不知道那是从哪里来的。 1、3 和 5 是我正在读取的文件中的正确数据,但所有其他数据来自哪里?
结构数据如下:
typedef struct competitor_status {
int id;
char name[MAX_TEXT_LENGTH];
char addres[MAX_TEXT_LENGTH];
char phone_number[MAX_TEXT_LENGTH];
float cucumber;
float carrot;
float bean;
struct competitor_status * left; /* links to teams with more or same points */
struct competitor_status * right; /* links to teams with less points */
} competitor_node;
typedef competitor_node * comp_node_ptr;
tmp_node = calloc(1, sizeof(tmp_node));
应该是 tmp_node = calloc(1, sizeof *tmp_node);
.
tmpnode
是指向一个节点的指针(sizeof tmp_node
应该是4或者8),但是你想为一个节点分配内存。
sizeof *tmp_node
是 tmp_node
指向的结构的大小。
在此代码中
competitor_node * tmp_node;
tmp_node = calloc(1, sizeof(tmp_node));
scan_status = fscanf(competitor_filename, "%[^\n]\n", tmp_node -> name );
变量 *tmp_node
是指向 competitor_node
的指针,您分配足够的内存 仅用于指针 而不是指针 competitor_node
。
即使您将此更正为
tmp_node = calloc(1, sizeof(*tmp_node));
内存初始化为0
所以下一行
scan_status = fscanf(competitor_filename, "%[^\n]\n", tmp_node -> name );
将 NULL
指针传递给 fscanf()
。
编辑 在 OP 发布后 typedef struct competitor_status
下一行不相关。
[ 你也必须初始化这个 struct
字段(以及 struct
中的任何其他指针)也许像这样
tmp_node->name = malloc(MAXSTRINGLENGTH+1);
但是没有足够的细节来更具体。 ]
我正在使用 scanf
读取文件。每行只是一个数据字段,所以我有一个 do while 循环。基本上我所做的是,阅读构建根目录的第一条信息(我用它来构建 BST)。但是当进入内部时。读奇怪的东西。读取并创建正确的所有数据,但对于循环的每次迭代,调用两次相同的方法来读取文件,我不知道现在发生了什么。
comp_node_ptr read_competitor_node(int id, FILE * competitor_filename){
int scan_status;
int feet;
double inches;
competitor_node * tmp_node;
tmp_node = calloc(1, sizeof(tmp_node));
scan_status = fscanf(competitor_filename, "%[^\n]\n", tmp_node -> name );
if(scan_status == EOF){
printf("End Of File. \n");
free(tmp_node);
return NULL;
}
tmp_node -> id = id;
fscanf(competitor_filename, "%[^\n]\n", tmp_node -> addres );
fscanf(competitor_filename, "%[^\n]\n", tmp_node -> phone_number );
fscanf(competitor_filename, "%d %lf", &feet, &inches );
tmp_node -> cucumber = convertToInches(feet, inches);
fscanf(competitor_filename, "%d %lf", &feet, &inches );
tmp_node ->carrot = convertToInches(feet, inches);
fscanf(competitor_filename, "%d %lf", &feet, &inches );
tmp_node -> bean = convertToInches(feet, inches);
printNode(tmp_node);
return tmp_node;
}
root = read_competitor_node(id, competitor_table_file);
do{
id++;
tmp_node = read_competitor_node(id, competitor_table_file);
add_competitor(root, tmp_node);
}while(tmp_node != NULL);
并打印以下数据:
Margaret Mouse 1 Southern 9565 1 ft -0.500000 in 2 ft -3.200001 in 1 ft -4.500000 in -134217728 ft 0.000000 in
2 1 ft -4.500000 in 1 ft -4.500000 in 1 ft -4.500000 in 0 ft 0.000000 in
Bert Hill 3 Central 2010 1 ft -7.200001 in 1 ft -8.200001 in 2 ft -11.700001 in 156587349 ft -4.000000 in
4 � 27263573 ft -4.000000 in 27263573 ft -4.000000 in 27263573 ft -4.000000 in 0 ft 0.000000 in
Donald Duck 5 Marine 1234567 2 ft -0.400000 in 2 ft -4.500000 in 1 ft -6.200001 in 145402538 ft -8.000000 in
6 � 27263570 ft -8.000000 in 27263570 ft -8.000000 in 27263570 ft -8.000000 in -67108864 ft 0.000000 in
End Of File.
2、4 和 6 我不知道那是从哪里来的。 1、3 和 5 是我正在读取的文件中的正确数据,但所有其他数据来自哪里?
结构数据如下:
typedef struct competitor_status {
int id;
char name[MAX_TEXT_LENGTH];
char addres[MAX_TEXT_LENGTH];
char phone_number[MAX_TEXT_LENGTH];
float cucumber;
float carrot;
float bean;
struct competitor_status * left; /* links to teams with more or same points */
struct competitor_status * right; /* links to teams with less points */
} competitor_node;
typedef competitor_node * comp_node_ptr;
tmp_node = calloc(1, sizeof(tmp_node));
应该是 tmp_node = calloc(1, sizeof *tmp_node);
.
tmpnode
是指向一个节点的指针(sizeof tmp_node
应该是4或者8),但是你想为一个节点分配内存。
sizeof *tmp_node
是 tmp_node
指向的结构的大小。
在此代码中
competitor_node * tmp_node;
tmp_node = calloc(1, sizeof(tmp_node));
scan_status = fscanf(competitor_filename, "%[^\n]\n", tmp_node -> name );
变量 *tmp_node
是指向 competitor_node
的指针,您分配足够的内存 仅用于指针 而不是指针 competitor_node
。
即使您将此更正为
tmp_node = calloc(1, sizeof(*tmp_node));
内存初始化为0
所以下一行
scan_status = fscanf(competitor_filename, "%[^\n]\n", tmp_node -> name );
将 NULL
指针传递给 fscanf()
。
编辑 在 OP 发布后 typedef struct competitor_status
下一行不相关。
[ 你也必须初始化这个 struct
字段(以及 struct
中的任何其他指针)也许像这样
tmp_node->name = malloc(MAXSTRINGLENGTH+1);
但是没有足够的细节来更具体。 ]