在 C 中使用递归从 txt 文件反向打印

Reverse printing from txt file using recursion in C

我需要使用递归在终端中向后写出 .txt 文件,但似乎卡住了。 到目前为止,这是我的代码,但它会创建一个无限循环。此外,过程 write() 应该只有 1 个参数 - 指向文件的指针。

#include <stdio.h>

void write(FILE **f)
{
    char cur;

    fseek(*f,-1,SEEK_CUR);
    cur = fgetc(*f);

    printf("%c",cur);
    write(f);
}

int main(void)
{
    FILE *f;
    f = fopen("text.txt","r");
    fseek(f, 0, SEEK_END);
    write(&f);
    
    fclose(f);
    return 0;
}

我想使用 fseekftell 函数,它们似乎是最好的方法。 我的预期输出是: 文件 Hello world 输出 dlrow olleH

这个任务其实不是很适合递归但是..

编辑我实际上误解了你的问题,但它同样微不足道。

#include <stdio.h>
#include <string.h>

void writeRecursive(FILE *file)
{
    int ch;
    if(fread(&ch, 1, 1, file) == 1) 
    { 
        writeRecursive(file);
        fwrite(&ch, 1, 1, file);
    }
    else
    {
        rewind(file);
    }

}

int main(void)
{
    FILE *fi = fopen("a.txt", "w+");
    char c;

    fprintf(fi, "123456789");
    rewind(fi);

    writeRecursive(fi);
    rewind(fi);
    while(fread(&c, 1, 1, fi) == 1)
    {
        printf("%c", c);
    }
    printf("\n");
}

https://godbolt.org/z/edGfKa

void writeRecursive(FILE *file)
{
    int ch;
    if((ch = fgetc(file)) != EOF) 
    { 
        writeRecursive(file);
        fputc(ch, file);
    }
    else
    {
        rewind(file);
    }

}

旧答案

void printRecursive(FILE *fi, FILE *fo)
{
    char ch;
    if(fread(&ch, 1, 1, fi) == 1) 
    { 
        printRecursive(fi,fo);
        fwrite(&ch, 1, 1, fo);
    }

}

int main(void)
{
    FILE *fi = stdin, *fo = stdout;

    printRecursive(fi, fo);
}

https://godbolt.org/z/YjfvcP

根据您给出的内容,使用 fseekftell 递归做题的方法可以写成如下,

#include <stdio.h>

void write(FILE **f)
{
    char cur;
    cur = fgetc(*f);
    printf("%c", cur);
    if (ftell(*f) == 1) return;
    fseek(*f,-2,SEEK_CUR);
    write(f);
}

int main(void)
{
    FILE *f;
    f = fopen("text.txt","r");
    fseek(f, -1, SEEK_END);
    write(&f);
    
    fclose(f);
    return 0;
}

考虑到文件是反向读取的,停止条件需要思考一下。指针的位置由 ftell 返回,使用它我们可以检测指针的当前位置是否在文件的开头(就像它是否等于 1)。

您的代码中存在一些小错误 - 递归从未停止(正如评论中所指出的),请确保您的递归函数中始终有一个停止。

您的 fseek 的顺序需要更改,以便您正确阅读第一个字符。

并且您需要在 fseek 中使用 -2 来移动到上一个字符。这是因为 fgetc 会将指针前进 1 个字符,您必须返回 1 个字符才能到达刚才读取的字符,然后您想要将其再向后移动一个字符,这样您就可以在刚刚阅读的角色之前找到角色。感谢 p-j-supports-women-in-poland 指出这一点。

否则上面的代码会让你明白,我希望。如果您仍然有疑问,请在评论中联系我。乐于助人:)