反转二进制文件会向其添加位而不会反转

时间:2014-06-18 12:06:39

标签: c file reverse binaryfiles

我正在编写一个函数,它获取带有整数的二进制文件并反转它们的顺序。 例如,我有这个二进制文件(十六进制):

00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 04

我希望它是:

00 00 00 04 00 00 00 03 00 00 00 02 00 00 00 01

但是凭借我的算法,我得到了这个:

00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 04 CC CC CC CC 00 00 00 00  CC CC CC CC

我不明白为什么...... 这是我的算法:

void reverse(FILE * fr)
{
    int i, num1, num2, fileLength;
    fseek(fr, 0, SEEK_END);
    fileLength = ftell(fr) / sizeof(int);
    for(i = 0; i < fileLength / 2; i++)
    {
        fseek(fr, i * sizeof(int), SEEK_SET);
        fread(&num1, sizeof(int), 1, fr);
        fseek(fr, i * sizeof(int), SEEK_END);
        fread(&num2, 4, 1, fr);
        fseek(fr, i * sizeof(int), SEEK_END);
        fwrite(&num2, sizeof(int), 1, fr);
        fseek(fr, i * sizeof(int), SEEK_SET);
        fwrite(&num1, sizeof(int), 1, fr);
    }
}
int main()
{
    FILE * f = fopen("test.bin", "r+b");
    reverse(f);
    fclose(f);
    getchar();
    return 0;
}

我做错了什么?

编辑:我的文件大小除以sizeof(int)。

编辑2:

在pts指出更改代码后,它仍然无法正常工作。 它输出:

CC CC CC CC CC CC CC CC 00 00 00 03 00 00 00 04 00 00 00 01 00 00 00 00 00 00 00 02

我编辑的代码如上所示。

(顺便说一下,对于所有评论者,我被告知不要将整个文件读取到内存然后反转它,因为它应该是文件操作的练习,而不是内存操作。)

感谢。

2 个答案:

答案 0 :(得分:3)

试试这个:

void reverse(FILE * fr)
{
    int i, num1, num2, fileLength;
    fseek(fr, 0, SEEK_END);
    fileLength = ftell(fr) / sizeof(int);
    for(i = 0; i < fileLength / 2; i++){
        fseek(fr, i * sizeof(int), SEEK_SET);
        fread(&num1, sizeof(int), 1, fr);
        fseek(fr, (-1-i) * sizeof(int), SEEK_END);
        fread(&num2, sizeof(int), 1, fr);
        fseek(fr, (-1-i) * sizeof(int), SEEK_END);
        fwrite(&num1, sizeof(int), 1, fr);
        fseek(fr, i * sizeof(int), SEEK_SET);
        fwrite(&num2, sizeof(int), 1, fr);
    }
}

int, int, int, int[EOF]
                  ^fseek(filep, 0, SEEK_END)
               ^
               fseek(filep, -1*sizeof(int), SEEK_END)

答案 1 :(得分:0)

在中间,你必须再次寻求。写作时使用num1和num2也是错误的。

    fread(&num2, 4, 1, fr);
    fseek(fr, i * sizeof(int), SEEK_END);  // Add this.
    fwrite(&num1, sizeof(int), 1, fr);     // num1.
    fseek(fr, i * sizeof(int), SEEK_SET);
    fwrite(&num2, sizeof(int), 1, fr);     // num2.