【发布时间】:2019-02-10 00:07:54
【问题描述】:
尝试用 C 编写一个我以前从未使用过的程序,将十六进制转换为二进制作为字符串并将其写入文件,唯一的问题是它在我想要的时候预先添加到输出文件中附加。 fprintf() 和 fputs() 都会出现这种情况。
这是附加代码:
while(fgets(line,1024,inputFile)){
lineLen = strlen(line);
binary = hexToBin(line, lineLen);
printf("Binary: %s\n", binary);
// output file does not exist
FILE *writeFile = fopen(argv[2], "a");
if (writeFile == NULL) {
fprintf(stderr, "write file not found: %s\n", strerror(errno));
exit(1);
}
printf("appending binary to file\n");
fprintf(writeFile,"%s\n",binary);
printf("appended\n");
}
这是 hexToBin 函数:
char* hexToBin(char hex[], size_t len){
// convert hexadecimal to binary
char *binString = (char*)malloc(sizeof(char)*4*len);
for (int i=0;i<len;i++){
char *binNum = hexToBinHelp(hex[i]);
strcat(binString,binNum);
free(binNum);
}
return binString;
}
hexToBinHelp 将十六进制字符作为其二进制表示的 char* 返回(例如 binNum=[0][0][0][0])。真的很长,所以我宁愿不放在这里,但如果有帮助的话可以放在这里。
当输入文件为:
000a
a000
输出文件是:
1010000000000000
0000000000001010
谢谢
【问题讨论】:
-
请注意,
malloc()不会初始化它返回的数据。要么使用calloc(),它将数据字节归零,要么在连接之前设置binString[0] = '\0';。 -
有趣,
hexToBinHelp()应该很短;最简单的实现调用另一个(也很小的)函数将 ASCII 十六进制数字转换为值 0..15(称为hexdigit()),然后您可以使用:const char *hexToBinHelp(char hex) { int hexval = hexdigit(hex); assert(hexval >= 0 && hexval < 16); static const char *bitstring[] = { "0000", "0001", "0010", …, "1101", "1110", "1111" }; return bitstring[hexval]; }— 您可能需要一个不太自信的错误处理机制. -
@JonathanLeffler 做了第一步。是的,它可能会更短,但它基本上只是一个巨大的 if 语句墙,所以我可以尝试找出附加的东西。谢谢!