2016-10-29 8 views
0

ブロック単位でファイルの内容を逆にするプログラムです。ブロック単位でブロックファイルの内容を逆

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

void reverse(char * buffer, int size) 
{ 
    char tmp; 
    int i; 
    for(i = 0; i < size/2; i++) 
    { 
    tmp = (char)buffer[i]; 
    buffer[i] = buffer[size - i - 1]; 
    buffer[size - i - 1] = tmp; 
    } 
} 

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

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

    fseek(f1, 0, SEEK_END); 

    long i = ftell(f1); 
    // long f1_len = ftell(f1); 
    // unsigned char tmp; 
    int if_end = 1; 
    int need = 0; 
    int count; 


    do 
    { 
    i = i - BS; 
    if(i < 0) 
    { 
     need = BS - abs(i); 
     i = 0; 
    } 
    else 
     need = BS; 

    fseek(f1, i, SEEK_SET); 

    if(if_end) // strip EOF 
    { 
     count = fread(buffer, need - 1, 1, f1); 
     if_end = 0; 
    } 
    else 
     count = fread(buffer, need, 1, f1); 

    reverse(buffer, count); 
    fwrite(buffer, count, 1, f2); 

    if(i == 0) 
     break; 
    }while(i > 0); 


    fclose(f1); 
    fclose(f2); 
    free(buffer); 

    return 0; 
} 

テストファイル:

$ xxd testfile 
0000000: 6162 6364 6566 670a      abcdefg. 
$ gcc test.c -o test 
$ ./test testfile testfile2 
$ xxd testfile2 
0000000: 61          a 

間違っている任意のアイデア?私はこれを長い間デバッグしてきました。

+0

を使用しましたする必要がありますreverse(buffer,count * need)

Similairlyすべき

のでreverse(buffer, count);ニーズ?あなたは何を見つけましたか? – kaylum

+1

'EOF'は実際にはファイルに格納されている文字ではありません。 – kaylum

+0

@kaylumはただそれを見ていましたが、テキストファイルの中にはEOFマーカー(0x1Aなど)を保存するものがあります。これは最後にとどまる必要があります。 –

答えて

1

問題は、fwriteは、成功したブロックの数を返します。バイト数ではありません。出力への書き込みは、あなたのプログラムの実行をトレースするために、デバッガをfwrite(buffer, count * need, 1, f2);

+0

あるいは、 'fread'と' fwrite'に渡された 'size'と' count'引数を入れ替えます。 –

関連する問題