在C语言中反转文本文件
我编写了以下代码,但当我输入“abcd”时,它显示“dcb”并跳过第一个字符。我知道while循环中的逻辑跨越了文件边界,但fseek(f2)在跨越文件边界时仍然不是0。它应该返回一些负值在C语言中反转文本文件,c,C,我编写了以下代码,但当我输入“abcd”时,它显示“dcb”并跳过第一个字符。我知道while循环中的逻辑跨越了文件边界,但fseek(f2)在跨越文件边界时仍然不是0。它应该返回一些负值 #include<stdio.h> int main() { FILE *f1,*f2; char ch; clrscr(); f1=fopen("Input","w"); while((ch=getchar())!=EOF)
#include<stdio.h>
int main()
{
FILE *f1,*f2;
char ch;
clrscr();
f1=fopen("Input","w");
while((ch=getchar())!=EOF)
putc(ch,f1);
fclose(f1);
f2=fopen("Input","r");
fseek(f2,-1L,2);
while(ftell(f2)!=0)
{
ch=getc(f2);
printf("%c",ch);
fseek(f2,-2L,1);
}
fclose(f2);
getch();
return(0);
}
#包括
int main()
{
文件*f1,*f2;
char ch;
clrsc();
f1=fopen(“输入”,“w”);
而((ch=getchar())!=EOF)
putc(ch,f1);
fclose(f1);
f2=fopen(“输入”,“r”);
fseek(f2,-1L,2);
while(ftell(f2)!=0)
{
ch=getc(f2);
printf(“%c”,ch);
fseek(f2,-2L,1);
}
fclose(f2);
getch();
返回(0);
}
您需要一个while循环,而不是while-do循环
当ftell()返回零时,需要读取字符,但不再读取。这通常表明您需要一个底部测试的循环,而不是顶部测试的循环。您需要一个do-while循环,而不是while-do循环
#include <stdio.h>
int main(){
FILE *fp;
int ch;
fp=fopen("out.txt","w");
while((ch=getchar())!=EOF)
fputc(ch,fp);
fclose(fp);
fp=fopen("out.txt","rb");
fseek(fp,0L,SEEK_END);
while(fseek(fp,-2L,SEEK_CUR)==0){
ch=fgetc(fp);
putchar(ch);
}
fclose(fp);
return(0);
}
当ftell()返回零时,需要读取字符,但不再读取。这通常表明您需要一个底部测试的循环,而不是顶部测试的循环。#include
#include <stdio.h>
int main(){
FILE *fp;
int ch;
fp=fopen("out.txt","w");
while((ch=getchar())!=EOF)
fputc(ch,fp);
fclose(fp);
fp=fopen("out.txt","rb");
fseek(fp,0L,SEEK_END);
while(fseek(fp,-2L,SEEK_CUR)==0){
ch=fgetc(fp);
putchar(ch);
}
fclose(fp);
return(0);
}
int main(){
文件*fp;
int-ch;
fp=fopen(“out.txt”,“w”);
而((ch=getchar())!=EOF)
fputc(ch,fp);
fclose(fp);
fp=fopen(“out.txt”、“rb”);
fseek(fp,0L,SEEK_END);
while(fseek(fp,-2L,SEEK_CUR)=0){
ch=fgetc(fp);
putchar(ch);
}
fclose(fp);
返回(0);
}
#包括
int main(){
文件*fp;
int-ch;
fp=fopen(“out.txt”,“w”);
而((ch=getchar())!=EOF)
fputc(ch,fp);
fclose(fp);
fp=fopen(“out.txt”、“rb”);
fseek(fp,0L,SEEK_END);
while(fseek(fp,-2L,SEEK_CUR)=0){
ch=fgetc(fp);
putchar(ch);
}
fclose(fp);
返回(0);
}
fseek(f2,-1L,2)代码>请不要这样做。包括正确的头文件(stdio.h)并使用常量SEEK_SET、SEEK_CUR、SEEK_END。这里最大的错误是,您试图将文件作为字符串进行反转。如果这不仅仅是一个练习,请记住,对于任何多字节编码(如utf-8)和no,使用wchar\u t不会有任何帮助:unicode组合字符会弄乱。正如@dasblinkenlight所暗示的,你真的不想这样做。您希望在大小合理的块中工作(例如,最小8K),将它们反转,并在开头的一个块和结尾的一个块之间交换位置(当然,假设文件至少有2个块)。fseek(f2,-1L,2)代码>请不要这样做。包括正确的头文件(stdio.h)并使用常量SEEK_SET、SEEK_CUR、SEEK_END。这里最大的错误是,您试图将文件作为字符串进行反转。如果这不仅仅是一个练习,请记住,对于任何多字节编码(如utf-8)和no,使用wchar\u t不会有任何帮助:unicode组合字符会弄乱。正如@dasblinkenlight所暗示的,你真的不想这样做。您希望在大小合理的块中工作(例如,最小8K),将它们反转,并在开头的一个块和结尾的一个块之间交换位置(当然,假设文件至少有2个块);但它仍然遗漏了最后一个字符…?“下一步”操作是对一个位置进行退格(2个位置,因为您刚刚读取了一个位置)。终止条件是不能退格。因此,将fseek()移动到可以退格的条件中并进行测试。这使得条件“(ftell(f2)!=0&&fseek(f2,-2L,SEEK_CUR)==0)”。使用当前的ftell(),您可以在已经在BOF时调用它。当您不确定函数是否会产生错误时,不要调用它们。我将循环更改为执行{ch=getc(f2);printf(“%c”,ch);fseek(f2,-2L,1);}while(ftell(f2)!=0);但它仍然遗漏了最后一个字符…?“下一步”操作是对一个位置进行退格(2个位置,因为您刚刚读取了一个位置)。终止条件是不能退格。因此,将fseek()移动到可以退格的条件中并进行测试。这使得条件“(ftell(f2)!=0&&fseek(f2,-2L,SEEK_CUR)==0)”。使用当前的ftell(),您可以在已经在BOF时调用它。当你不确定函数是否会产生错误时,不要调用函数。这是一个非常干净的解决方案,但是一些C库在文件开始之前不会返回错误。在fseek()之前添加一个ftell(),您应该了解所有库行为。我认为这并不干净。我不认为使用fseek来逆转潮流是一个好方法。这是一个非常干净的解决方案,但是一些C库在文件开始之前不会返回错误。在fseek()之前添加一个ftell(),您应该了解所有库行为。我认为这并不干净。我不认为使用fseek来逆转潮流是一个好方法。那么,如果有必要,是否有人修复该程序。