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 &gt;= 0 &amp;&amp; hexval &lt; 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`? [复制]

我啥时候应该增加 xcdatamodeld 版本?

C语言构建函数啥时候必须添加参数列表

Django:啥时候运行makemigrations?

加jar包啥时候需要添加类路径

在 Windows 上,啥时候应该使用“\\\\?\\”文件名前缀?