删除C中的最后一个新行

Caf*_*olf 2 c file

我想从以下函数中删除最后一个新行:

void WriteToFile(node *tree)
{
    void Write(node*);
    fp = fopen("dictionary.txt","w");
    if(fp==NULL)
    {
        printf("Cannot open file for writing data...");
    }
    else //if(tree==NULL)
    {
        if(tree!=NULL)
        {
            Write(tree);
        }
        fclose(fp);  
    }
}
void Write(node *tree)
{
    if(tree!=NULL)
    {
        fprintf(fp,"%s:%s\n",tree->word,tree->meaning);
        Write(tree->left);
        Write(tree->right);
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用此函数将文本文件写入BST的内容,我不希望它写入最后一个新行,我该如何删除它?

pmg*_*pmg 5

在像你这样的递归例程中,你不能轻易知道哪个是最后一个调用,但你可以知道第一个调用是什么.

不是编写数据和可选的换行符,而是考虑编写一个可选的换行符后跟数据:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,考虑文本模式文件的最常用的行定义是:0或更多字符的序列,包括换行符.根据这个定义,所有线都有换行符; 并且文件中的最后一段数据不是一行.

至少有一个我用过的写得不好的程序因此无法处理整个输入.我的猜测是它有类似的东西

fgets(buf, sizeof buf, inf);
inlen = strlen(buf);
if (buf[inlen - 1] == '\n') processline(buf);
Run Code Online (Sandbox Code Playgroud)

如果最后一条数据包含换行符,这个编写得很糟糕的程序就可以工作.