gpt4 book ai didi

c - 编写一个程序,用有限的文件定位步骤反转二进制文件中字节的顺序

转载 作者:太空宇宙 更新时间:2023-11-04 03:01:12 25 4
gpt4 key购买 nike

我需要编写一个程序来反转给定二进制文件中字节的顺序。它在命令行中接受文件名。此外,它可以在不超过固定次数的情况下使用文件定位功能,例如 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;
}

它使用了一个额外的文件。我当然相信有一种更短、更优雅的方法可以按照要求用更少的步骤来做到这一点。有什么建议吗?

还有一点:好像第一个条件总是被填满,怎么会呢?

最佳答案

#include <stdio.h>

long max(long v1, long v2) { return v1 >= v2 ? v1 : v2; }
long min(long v1, long v2) { return v1 >= v2 ? v2 : v1; }
void invert_bits(char *arr, size_t size);

int main(int argc, char *argv[]) {
size_t read_sz;
FILE * infile = fopen(argv[1], "r");
fseek(infile, 0, SEEK_END);
long file_sz = ftell(infile);
long offset = file_sz;
long total_read = 0;
long num_seeks = 10;
size_t buffer_sz = (file_sz + num_seeks - 1) / num_seeks;
char buffer[buffer_sz];
while (file_sz > total_read) {
if ((offset + num_seeks - 1) / num_seeks < buffer_sz) {
buffer_sz = offset / num_seeks;
}
offset = max(0, offset - buffer_sz);
fseek(infile, offset, SEEK_SET);
read_sz = fread(buffer, 1,
min(buffer_sz, file_sz - total_read), infile);
total_read += read_sz;
invert_bits(buffer, read_sz);
num_seeks--;
}
fclose(infile);
}

void invert_bits(char *arr, size_t size) {
size_t i;
int j;
for (i = size; i > 0; i--) {
char v = arr[i - 1];
char o = 0;
for (j = 0; j < 8; j++) {
o |= v & 1;
v >>= 1;
o <<= 1;
}
printf("%c", o);
}
}

关于c - 编写一个程序,用有限的文件定位步骤反转二进制文件中字节的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11526211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com