使用scanf和do-while循环读取文件
我正在用使用scanf和do-while循环读取文件,c,scanf,do-while,C,Scanf,Do While,我正在用scanf读取一个文件。每行只是一个数据字段,所以我有一个do-while循环。基本上,我要做的是,阅读构建根目录的第一条信息(我正在使用它构建BST)。但是当你进入房间的时候,就要做一段时间。读一些奇怪的东西。读取并创建正确的所有数据,但是对于循环的每个迭代,调用两次相同的方法来读取文件,我不知道现在发生了什么 comp_node_ptr read_competitor_node(int id, FILE * competitor_filename){ int scan_sta
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_节点=calloc(1,sizeof(tmp_节点))代码>应该是tmp_节点=calloc(1,sizeof*tmp_节点)代码>
tmpnode
是指向节点的指针(tmp_节点的大小应为4或8),但您希望为节点分配内存
sizeof*tmp\u node
是tmp\u node
所指向的结构的大小。
competitor_node * tmp_node;
tmp_node = calloc(1, sizeof(tmp_node));
scan_status = fscanf(competitor_filename, "%[^\n]\n", tmp_node -> name );
变量*tmp\u node
是指向竞争对手\u node
的指针,您只为一个指针分配足够的内存,而不是为一个竞争对手\u node
分配足够的内存
即使您将此更正为
tmp_node = calloc(1, sizeof(*tmp_node));
内存初始化为0
,因此下一行
scan_status = fscanf(competitor_filename, "%[^\n]\n", tmp_node -> name );
正在将NULL
指针传递到fscanf()
编辑以下OP postingtypedef struct competitor_status
下一行不相关
[您也必须初始化此struct
字段(以及struct
中的任何其他指针),可能是这样的
tmp_node->name = malloc(MAXSTRINGLENGTH+1);
但是没有足够的细节来更加具体。]如果不是数组,为什么要使用calloc
初始化tmp\u节点
?改为使用malloc
,确保分配给该变量的所有空间都设置为零,删除之前的内容,否则输出看起来像是代码上的缓冲区溢出,或者错误的指针分配。请尝试使用malloc
和memset
检查错误是否持续添加了有关结构和指针的信息。我为结构和comp_节点添加了更多信息。感谢您的回答,但对于tmp_节点=calloc(1,sizeof(*tmp_节点)),仍然存在相同的问题@Jota_sk还是您遇到问题的convertToInches()
或add_competitor()
或printNode()
?这些都没有显示。请阅读MCVE页面!他不是在印刷问题吗。问题在于,实际上该节点是创建并插入到树中的。如您所见,id为2、4和6(id是名称后面的数字)的节点是创建的节点,我不知道从何处创建的。节点1、3和5是具有来自文件的正确数据的节点。已解决的问题来自前面提到的函数。是的,我阅读了MCVE页面,这有助于我解决问题,我创建了一个新项目,带有一个非常基本的测试功能,我看到了错误,谢谢。