Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用scanf和do-while循环读取文件_C_Scanf_Do While - Fatal编程技术网

使用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 posting
typedef 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页面,这有助于我解决问题,我创建了一个新项目,带有一个非常基本的测试功能,我看到了错误,谢谢。