c中没有结构的反向二进制文件

时间:2015-01-28 10:14:32

标签: c file binaryfiles fseek

我有一个数字的二进制文件,例如1234.我需要将其反转在C 中变为4321而没有结构或数组来帮助我。我想要提交指针:一个是开始,另一个是结束,交换它们直到它们相互接触。

这是我的代码:

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

它看起来很好,没有任何错误,但文件保持不变。

2 个答案:

答案 0 :(得分:0)

最简单的方法:

1-从下到上阅读文件,将字节写入临时文件(从上到下)

2-调用unlink()删除原始文件

3-重命名()将临时文件作为原始文件

但那被称为作弊:p

答案 1 :(得分: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--;
    }
}