2016-10-28 12 views
1

私は入力ファイルの内容を逆にして出力ファイルに書き込むために、Cで小さなプログラムを書いています。その "テキストの終わり"を取り除く方法

#include <stdio.h> 
#include <stdlib.h> 
#define BS 12 

int main (const int argc, const char** argv) 
{ 
    if(argc != 3) 
    exit(-1); 

    unsigned char buffer[BS]; 
    FILE * f1, * f2; 
    f1 = fopen(argv[1], "r"); 
    f2 = fopen(argv[2], "w"); 

    fseek(f1, 0, SEEK_END); 

    long i = 0, j = 0; 
    long f1_len = ftell(f1); 
    unsigned char tmp; 

// while(i >= 0) 
// { 
    for(i = ftell(f1), j = 0; i >= 0 && j <= BS - 1; i--, j++) 
    { 
     fseek(f1, i, SEEK_SET); 
     tmp = fgetc(f1); 

     if(i == f1_len || tmp == (unsigned char)0x03) 
     continue; 
     else 
     buffer[j] = tmp; 
    } 
    if(j == BS - 1) 
     fwrite(buffer, BS, 1, f2); 
    else 
     fwrite(buffer, j, 1, f2); 

    fflush(f2); 
// } 

    fclose(f1); 
    fclose(f2); 

    return 0; 
} 

テストファイル:

$ xxd testfile 
0000000: 6162 6364 6566 670a      abcdefg. 

テスト:

$ gcc test.c -o test 
$ test testfile testfile2 
$ xxd testfile2 
0000000: 030a 6766 6564 6362 61     ..gfedcba 

なぜ '0×03' はありますか?私はすでにその文字を取り除くためにtmp == (unsigned char)0x03を書きましたか?

答えて

0

すでに述べたように、0x03は初期化されていないメモリです。さらに、別の問題があります.fseek(f1、ftell(f1)、SEEK_SET)は、ファイルの位置を最後まで移動します。次のfgetc()はEOFを返します。したがって、あなたのループは次のようになります。

ため

(I = のftell(F1)-1、J = 0; i>を= 0 & & J < = BS - 1; i--、J ++){ ....}

2

continueを使用すると、文字0x03はスキップされますが、まだj++が実行されるため、バッファは前方に移動します。

つまり、0x03は実際には初期化されていないメモリです。

j++をループ宣言の内側ではなく、ループの最後に移動するだけです。


サイドノード:コードを読む私は多くの点で改善できると感じています。おそらく、バグが修正されたときにhttps://codereview.stackexchange.com/にそれについて尋ねるべきでしょう。

関連する問題