В такой рекурсивной процедуре, как ваша, вы не можете легко узнать, какой последний вызов, но вы можете знать, какой первый вызов.
Вместо записи данных и, необязательно, новой строки, рассмотрите возможность написания необязательного символа новой строки, за которым следуют данные:
void FirstWrite(node *tree, FILE *fp)
{
if (tree)
{
fprintf(fp, "%s%s", tree->word, tree->meaning);
Write(tree->left, fp);
Write(tree->right, fp);
}
}
void Write(node *tree, FILE *fp)
{
if (tree)
{
fprintf(fp, "\n%s%s", tree->word, tree->meaning);
Write(tree->left, fp);
Write(tree->right, fp);
}
}
Но рассмотрим наиболее часто используемое определение строки для файлов в текстовом режиме: последовательность из 0 или более символов, за которой следует новая строка . Согласно этому определению все строки имеют новую строку; и последний фрагмент данных в вашем файле не является строкой.
По крайней мере одна плохо написанная программа, которую я использовал, не может обработать весь ввод из-за этого. Я думаю, что это что-то вроде
fgets(buf, sizeof buf, inf);
inlen = strlen(buf);
if (buf[inlen - 1] == '\n') processline(buf);
Эта плохо написанная программа сработает, если последний фрагмент данных будет содержать символ новой строки.