2015-11-23 50 views
0

我正在用scanf读取文件。每行只有一个数据字段,所以我有一个do while while循环。基本上我所做的是,阅读第一个构建根的信息(我使用它来构建BST)。但是,当进入内心的时候。阅读奇怪的事情。读取并创建正确的所有数据,但对于循环的每次迭代,调用两次相同的方法来读取文件,而现在我不知道发生了什么。用scanf和while while循环读取文件

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; 
+0

为什么你使用'calloc'来初始化'tmp_node'如果它不是一个数组?请改用'malloc' –

+0

确保分配给该变量的所有空间都设置为零,以前删除 –

+0

之前的那些输出,看起来您的代码看起来像是一个BufferOverFlow,或者指针分配不当。 –

回答

2

在此代码

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()

编辑 folowing OP发帖typedef struct competitor_status接下来的行是不相关的。

[你必须初始化这个struct场太(并在struct任何其他指针),或许这样

tmp_node->name = malloc(MAXSTRINGLENGTH+1); 

,但没有足够的细节更加具体。 ]

+0

我为结构添加了更多信息,并且为comp_node_ptr变量 –

+0

感谢您的回答,但仍然存在相同的问题也用tmp_node = calloc(1,sizeof(* tmp_node)); –

+0

@Jota_sk或者它是'convertToInches()'或'add_competitor()'或'printNode()'你有问题吗?没有显示。请阅读MCVE页面! http://stackoverflow.com/help/mcve –

0

tmp_node = calloc(1, sizeof(tmp_node));应该是tmp_node = calloc(1, sizeof *tmp_node);

tmpnode是指向节点的指针(sizeof tmp_node应该是4或8),但是您希望为节点分配内存。

sizeof *tmp_node是struct tmp_node指向的大小。