我正在编写一个函数来获取包含整数的二进制文件并反转它们的顺序。 例如,我有这个二进制文件(十六进制):
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/