在我的程序中,我试图从二进制文件中读取数据,然后将它的十六进制表示写入txt文件。
#include <stdio.h>
#include <stdlib.h>
int counter = 0;
int read;
int i = 0;
long size;
FILE *file1 = NULL;
FILE *file2 = NULL;
fpos_t length;
char newLine = '\n';
int main(int argc, char **argv) {
if (argc < 2) {
printf("Use: %s file1 file2", argv[0]);
exit (-1);
}
unsigned char hex[513];
unsigned char buffer[257];
file1 = fopen(argv[1], "rb");
fseek(file1, 0, SEEK_END);
fgetpos(file1, &length);
size = length.__pos;
fseek(file1, 0, SEEK_SET);
if (file1) {
file2 = fopen(argv[2], "w");
if (!file2) {
printf("Cannot open file: %s\n", argv[2]);
exit(-1);
}
while (counter < size) {
read = fread(buffer, 1, 256, file1);
counter += read;
i = 0;
while (i < read) {
sprintf(hex, "%02x", buffer[i++]);
}
fwrite(hex, 1, 512, file2);
fwrite(&newLine, 1, 1, file2);
}
} else
printf("Cannot open file %s\n", argv[1]);
fclose(file1);
fclose(file2);
}
不幸的是,数据无法正确写入txt文件。请帮我找出错误。这段代码有什么问题?
答案 0 :(得分:3)
问题的一部分是sprintf
调用会覆盖hex
中的任何内容。它没有附加到它。因此,结果是它将该缓冲区的完整大小写入文件,但它只有最后一个十六进制值(在前2个字节中)。
答案 1 :(得分:1)
这是你的(主要)问题:
while (i < read) {
sprintf(hex, "%02x", buffer[i++]);
}
您不是将buffer[i++]
的十六进制表示附加到hex
,而是覆盖 hex
中的内容。
这是解决这个问题的方法之一(略带hackish和丑陋):
usigned char *hp = hex;
...
while (i < read) {
sprintf(hp, "%02x", buffer[i++]);
hp+=2;
}
hp
最初指向hex
的开头;每次循环时,都会将其前进两个位置,以便每个sprintf
附加到hex
。
请注意,无论您实际存储多少个值,sizeof(hex)
总是评估为513。如果您要尝试指示每行写入了多少个字符,最好写2*read
。