【发布时间】:2012-07-17 15:48:47
【问题描述】:
我需要编写一个程序来反转给定二进制文件中字节的顺序。它接受命令行中的文件名。此外,它可以使用文件定位功能,如 fseek 不超过固定次数。
这是我写的一段代码,它没有使用固定次数:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char** argv) {
if (argc>2) {
printf("Please enter a valid file name");
return 1;
} else {
FILE* file;
file=fopen(argv[1], "r");
if (file==NULL) {
printf("Please enter a valid file name");
return 1;
} else {
FILE* fileBackUp;
fileBackUp=fopen("c:\backupFile.txt", "w+");
fseek(file, 0, SEEK_END);
fseek(file, -1, SEEK_CUR);
while (ftell(file)>=0) {
int c= fgetc(file);
fputc(c, fileBackUp);
fseek(file, -2, SEEK_CUR);
}
fseek(fileBackUp, 0, SEEK_SET);
int c;
while (!feof(fileBackUp)) {
c=fgetc(fileBackUp)
fputc(c,file);
}
fclose(fileBackUp);
fclose(file);
}
}
return 1;
}
它为此使用了一个额外的文件。我当然相信有一种更短的优雅方法可以按照要求减少步骤。有什么建议吗?
还有一件事:好像第一个条件总是被满足,怎么回事?
【问题讨论】:
-
应该将其标记为“作业”吗?如果没有,为什么限制你可以调用多少个 fseek?
-
你想反转bits还是反转bytes?
-
@mfrankli:7 月份的作业? :) 不,这是我试图回答的过去测试中的一个问题。
-
不——你仍然只是颠倒字节的顺序——如果你想颠倒所有的位,那么你也需要对每个字节做一点颠倒。
-
否 - 文件 I/O 在字节级别工作。