C 程序预先添加,啥时候应该添加
Posted
技术标签:
【中文标题】C 程序预先添加,啥时候应该添加【英文标题】:C program prepends, when it should appendC 程序预先添加,什么时候应该添加 【发布时间】: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 语句墙,所以我可以尝试找出附加的东西。谢谢!
【参考方案1】:
您的循环每次迭代都调用 fopen(),并且从不关闭或刷新此文件流。写入被缓冲,等待缓冲区填满或被刷新或文件被关闭;所以下次你调用 fopen() 时,你会得到与第一次相同的指针。
你很幸运它没有崩溃。 :) 不要重复调用 fopen()。在循环外调用一次,在内部使用或移动指针,然后在调用 fclose() 之外返回。
【讨论】:
谢谢。花了一点,但我得到了它的工作。我在 fprintf 行之后添加了 fclose(writeFile) 。我还必须将 free(binary) 行移到之后(对于任何好奇的人),这似乎已经做到了。 不客气。每次循环迭代都可以打开和关闭同一个文件,但没有必要;对于性能和一般来说,让它从外部打开会更好,就像你对 inputFile 指针所做的那样。 fprintf() 每次都会自动移动 writeFile 指针,因此它会自行跟踪接下来要写入的位置。使用缓冲区卢克,;) 它是你的朋友而不是你的敌人。以上是关于C 程序预先添加,啥时候应该添加的主要内容,如果未能解决你的问题,请参考以下文章
如果我在 C 或 C++ 中执行 `typedef`,我啥时候应该在 typedef'ed 类型的末尾添加 `_t`? [复制]