2016-10-29 3 views
0

Also hier ist das Programm, um den Inhalt einer Datei blockweise umzukehren.umgekehrter Inhalt der Datei Block für Block

#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; 
} 

testdat:

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

Jede Idee, wo falsch? Ich habe das schon lange getestet.

+0

Haben Sie einen Debugger die Ausführung des Programms zu verfolgen verwendet werden muss sein? Was hast du gefunden? – kaylum

+1

Beachten Sie, dass 'EOF' kein Zeichen ist, das in einer Datei gespeichert ist. – kaylum

+0

@kaylum hat sich das nur angesehen, aber einige Textdateien speichern einen EOF-Marker (sagen wir 0x1A), der am Ende bleiben müsste. –

Antwort

1

Ihr Problem ist, dass fwrite die Anzahl der erfolgreichen Blöcke zurückgibt, nicht die Anzahl der Bytes.

So braucht reverse(buffer, count);reverse(buffer,count * need)

Similairly die Schreib an den Ausgang fwrite(buffer, count * need, 1, f2);

+0

Oder tauschen Sie die Argumente 'size' und' count' aus, die an 'fread' und' fwrite' übergeben werden. –