2015-01-28 2 views
0

У меня есть двоичный файл чисел, например 1234. Мне нужно отменить его в C, чтобы стать 4321 без структур или массивов, чтобы помочь мне. Я думал о том, что нужно указывать указатели: один для начала и один до конца, и поменяйте их, пока они не достигнут друг друга.обратный двоичный файл без структур в c

Это мой код:

#include <stdio.h> 
int main() { 
FILE* f1; 
f1 = fopen("C:\\temp\\file2.bin","r+b"); 
if (!f1) { 
    fprintf(stderr, "file doesn't exist"); 
    exit(1); 
} 
reverse(f1); 
fclose(f1); 
exit(0); 
} 

void reverse(FILE* fr) { 
int i1 = 0, i2 = -2; 
char c = '\0', tmp = '\0', size; 
FILE* f1 = fr; 
fseek(fr, 0, SEEK_END); 
size = ftell(fr); 
fseek(fr, -1, SEEK_END); 
while ((i1 - i2) != size+2) { 
    fread(&c,1, 1, fr); 
    fseek(f1, i1, SEEK_SET); 
    fread(&tmp, 1, 1, f1); 
    fwrite(&c,1, 1, f1); 
    fwrite(&tmp, 1, 1, fr); 
    fseek(fr, i2, SEEK_END); 
    i1++; 
    i2--; 
} 
fclose(f1); 
} 

кажется Allright и не имеет каких-либо ошибок, но файл остается неизменным.

+0

Th последняя FSEEK должна быть SEEK_SET - не SEEK_END –

+0

Если это не наоборот, кажется, что у вас одна большая ошибка. . Но я думаю, что @ DanByström прав. –

+0

Вы говорите о fseek (fr, i2, SEEK_END)? Зачем? Я хочу установить fr на следующий символ с конца, и i2 всегда будет отрицательным, чтобы он соответствовал. – Avital

ответ

0

Самый простой способ:

1- прочитать файл снизу вверх, записать байты в временный файл (сверху вниз)

2- вызов Разорвать связь() для удаления исходного файла

3- переименовать() временный файл в качестве исходного

Но это называется обман: р

0

Это работает для меня. Это, вероятно, может быть оптимизирован немного, читая из того же места, и последующий байт, но я не тратил свое время, чтобы оптимизировать его:

void reverse(FILE* fr) 
{ 
    int i1 = 0, i2 = -2; 
    char c = '\0', tmp = '\0'; 
    long size; 
    fseek(fr, 0, SEEK_END); 
    size = ftell(fr); 
    getch(); 
    while ((i1 - i2) < size+2) 
    { 
     fseek(fr, i1, SEEK_SET); 
     fread(&c,1, 1, fr); 
     fseek(fr, i2, SEEK_END); 
     fread(&tmp, 1, 1, fr); 
     fseek(fr, i2, SEEK_END); 
     fwrite(&c,1, 1, fr); 
     fseek(fr, i1, SEEK_SET); 
     fwrite(&tmp, 1, 1, fr); 
     i1++; 
     i2--; 
    } 
} 
+0

Я понимаю это сейчас. Спасибо. – Avital

Смежные вопросы