2016-04-26 14 views
0

がオフに開始するには、私は別の1の補数が含まれているC-ファイルを(復号化するために、ユーザーに尋ねたとえば、偶然見つけC.Cプログラミング - ファイルの終わりの1の補数

で初心者ですc-ファイル)。

通常は、次の文

while ((ch = fgetc(fs)) != EOF) 

を使用して文字をコピーしますが、ファイルを復号化しながら、私は、問題を抱えています。私は以下を試しました -

while (~(ch = fgetc(fs)) != EOF) 

結果は - プログラムが不定ループに入ります。私はEOFのASCII値(26)を使ってみましたが、それでも私の好きなところではうまくいきませんでした。

ご協力いただければ幸いです。前もって感謝します。


/*ファイルを復号するためのプログラム*/

ここでは完全なコードがある - あなたが値を比較する必要が

#include<stdio.h> 
    #include<stdlib.h> 

    void main() 
    { 
     FILE *fs, *ft; 
     char ch; 

     fs = fopen("xyz.c", "r"); 
     ft = fopen("xyz1.c", "w"); 

     if((fs == NULL) || (ft == NULL)) 
     { 
      printf("Cannot open the file.\n"); 
      exit(1); 
     } 

     while (~(ch = fgetc(fs)) != EOF) 
      fputc(~ch, ft); 

     fclose(fs); 
     fclose(ft); 
    } 
+2

'EOF'は文字ではありません。それはストリーム状態であり、 'getchar()'はファイルの終わりに達したために読み込みに失敗したときに 'EOF'を返します。あなたが解読しているものの一部ではありません(補完する必要はありません)。 – FatalError

+2

あなたの質問を更新して、使用している実際のコードを表示してください。 'while(((〜ch)= fgetc(fs))!= EOF)'はコンパイルされません。あなたは割り当ての左側に '(〜ch)'を持つことはできません。 –

+1

'ch 'はどうやって宣言しましたか? –

答えて

2

EOFは、ファイル(またはストリーム)の終わりに達したことを通知するマーカーです。今度は、そのようなマーカーはあなたが処理しません。は内部のファイルシステムによって管理されているため、このマーカーを変更(またはこの場合は暗号化)できません。 (EOFは、ほとんどの実装上の-1あるので~-10ある)

したがって、​​をチェックすると、論理的に間違っているとそれだけで特定の値をキャッチします。

は単に:

int ch; 
while ((ch = fgetc(fs)) != EOF) 
    int decoded = ~ch; 
+0

ありがとう。 whileループは私のために働いた。 – Ashish

0

EOFfgetc(fs)に戻りました。 ~演算子をに適用するのは、の比較を行った後に限られます。

fgetc()の結果に~を適用すると、問題が発生します。たとえば、'a'の文字を読み取った場合、chintである必要があり、charではない)の値は、97(ASCIIベースのシステムを想定)になります。 ~97は非常に大きな負の数になるでしょう。おそらく約20億〜結果の下位ビットだけを取得する必要があります。

+0

は、キースありがとう..しかし、「黒」と指摘した - > EOFはマーカーであり、内部的に管理されています。..だから私はEOFを比較するための同じ最初のwhileループと一緒に使用し、whileループの中の残りの文字については1番目の補数を使用するべきです。わたしにはできる。 ありがとうございます。 – Ashish

+0

@Ashish:はい、それは私が言ったことです。 –

+0

私の悪いです。私は最初にあなたのコメントを理解していませんでした。しかし、ありがとう:) – Ashish

関連する問題