在 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;
}
我想使用 fseek 和 ftell 函数,它们似乎是最好的方法。
我的预期输出是:
文件
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");
}
或
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);
}
根据您给出的内容,使用 fseek
和 ftell
递归做题的方法可以写成如下,
#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 指出这一点。
否则上面的代码会让你明白,我希望。如果您仍然有疑问,请在评论中联系我。乐于助人:)
我需要使用递归在终端中向后写出 .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;
}
我想使用 fseek 和 ftell 函数,它们似乎是最好的方法。
我的预期输出是:
文件
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");
}
或
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);
}
根据您给出的内容,使用 fseek
和 ftell
递归做题的方法可以写成如下,
#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 指出这一点。
否则上面的代码会让你明白,我希望。如果您仍然有疑问,请在评论中联系我。乐于助人:)