使用 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_nodetmp_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);

但是没有足够的细节来更具体。 ]