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

标签 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

我编辑的代码如上所示。

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

谢谢。

最佳答案

试试这个:

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)

关于c - 反转二进制文件会向其添加位而不是反转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24285165/

相关文章:

c++ - 字节顺序转换 C++

c++ - C++ 异常和 setjmp/longjmp 的代价

python - 将负 float 转换为无符号整数

c - 在 C 项目中声明和使用结构的正确方法?

python - 从 python 中的另一个文件导入类 - 我知道修复方法,但为什么原始文件不起作用?

java - 反转链表

c - 反转输入字符串的函数。显示反转的字符串,但只有指针,没有括号[],没有库。函数将在内存中更改

C结构体使用前要初始化吗?

PYTHON多次从引用文件打印

java - LinearLayoutManager setReverseLayout() == true 但项目从底部堆叠