2012-05-08 19 views
0

私は次のコードを書いたが、 "abcd"と入力すると "dcb"と表示され、最初の文字はスキップされる。whileループの論理がファイル境界を越えるがfseek(f2)ファイル境界を横切ってもまだ0ではありません。負の値が返されます。Cのテキストファイルを反転する

#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); 
} 
+9

'fseek(f2、-1L、2);'これをしないでください。適切なヘッダーファイル(stdio.h)をインクルードし、定数SEEK_SET、SEEK_CUR、SEEK_ENDを使用します。 –

+2

ここで最大の間違いは*ファイル*をあたかも*文字列*のように逆転しようとしていることです。 – dasblinkenlight

+2

これは単なる練習ではない場合は、マルチバイトエンコーディング(utf-8など)とnoの場合は失敗することに注意してください。wchar_tを使用するとUnicodeの組み合わせ文字が混乱します。 –

答えて

5

while-doループではなく、do-whileループが必要です。

ftell()はゼロを返しますが、それ以上読み取ることはできません。これは、通常、テスト済みのループではなく、テスト済みのループが必要であることを示しています。

+0

ループを に変更しました { ch = getc(f2); printf( "%c"、ch); fseek(f2、-2L、1); } while(ftell(f2)!= 0); まだ最後の文字が欠けています...? – Ayush

+0

"次の"アクションは、ポジションをバックスペーシングしています(2ポジション、あなたが1つだけを読むので)。終了条件はバックスペースできないことです。したがって、fseek()を条件に移動し、バックスペースできることをテストします。それは条件 "(ftell(f2)!= 0 && fseek(f2、-2L、SEEK_CUR)== 0)"になります。現在のftell()では、すでにBOFにいるときに呼び出すことができます。エラーが発生しないことがわからないときに関数を呼び出さないでください。 –

0
#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); 
} 
+0

これは非常にクリーンな解決策ですが、一部のCライブラリは、ファイルの開始前にシークするためのエラーを返しません。 fseek()の前にftell()を追加すると、すべてのライブラリの動作をカバーする必要があります。 –

+0

私はきれいだとは思わない。私はfseekを使ってストリームを逆転させる良い方法はないと思う。 したがって、必要に応じて誰でもプログラムを修正しますか? – BLUEPIXY