我正在编写一个函数,它获取带有整数的二进制文件并反转它们的顺序。 例如,我有这个二进制文件(十六进制):
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
我编辑的代码如上所示。
(顺便说一下,对于所有评论者,我被告知不要将整个文件读取到内存然后反转它,因为它应该是文件操作的练习,而不是内存操作。)
感谢。
答案 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.