Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中反转文本文件_C - Fatal编程技术网

在C语言中反转文本文件

在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)

我编写了以下代码,但当我输入“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)
            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来逆转潮流是一个好方法。那么,如果有必要,是否有人修复该程序。