A way to help callback functions like this (you pass a pointer to a function to some generic routine, and it calls your function), is to arrange it so that you can also pass a "void *userData" pointer along for the ride.
This user data pointer can be anything (it's void*). Use it to maintain any kind of context that your processing function needs from one call to the next.
In this example, the user data is just a FILE*
Code:
/* ==================== printList ======================
Prints the phone book.
Pre list has been created (may be null)
Post printed
*/
void printList (BST_TREE* list)
{
// Statements
printf("\n*Name List*\n");
BST_Traverse (list, processStu,stdout);
{
FILE *fp = fopen("file.txt","w");
BST_Traverse (list, processStu,fp);
fclose(fp);
}
printf("*End of List*\n");
return;
} // printList
/* =================== BST_Traverse ===================
Process tree using inorder traversal.
Pre Tree has been created (may be null)
process ÒvisitsÓ nodes during traversal
Post Nodes processed in LNR (inorder) sequence
*/
void BST_Traverse (BST_TREE* tree,
void (*process) (void* dataPtr, void *userData), void *userData)
{
// Statements
_traverse (tree->root, process, userData);
return;
} // end BST_Traverse
/* =================== _traverse ===================
Inorder tree traversal. To process a node, we use
the function passed when traversal was called.
Pre Tree has been created (may be null)
Post All nodes processed
*/
void _traverse (NODE* root,
void (*process) (void* dataPtr, void *userData), void *userData)
{
// Statements
if (root)
{
_traverse (root->left, process, userData);
process (root->dataPtr, userData);
_traverse (root->right, process, userData);
} // if
return;
} // _traverse
/* =================== processStu =====================
Print one student's data.
Pre stu is a pointer to a student
Post data printed and line advanced
*/
void processStu (void* stuPtr, void *userData)
{
// Local Definitions
STUDENT aStu;
// Statements
aStu = *(STUDENT*)stuPtr;
fprintf(userData, "%-25s %s\n",
aStu.name,aStu.phone);
return;
} // processStu