我有一个数字的二进制文件,例如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);
}
它看起来很好,没有任何错误,但文件保持不变。
答案 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--;
}
}