【问题标题】: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 语句墙,所以我可以尝试找出附加的东西。谢谢!

标签: c append prepend


【解决方案1】:

您的循环每次迭代都调用 fopen(),并且从不关闭或刷新此文件流。写入被缓冲,等待缓冲区填满或被刷新或文件被关闭;所以下次你调用 fopen() 时,你会得到与第一次相同的指针。

你很幸运它没有崩溃。 :) 不要重复调用 fopen()。在循环外调用一次,在内部使用或移动指针,然后在调用 fclose() 之外返回。

【讨论】:

  • 谢谢。花了一点,但我得到了它的工作。我在 fprintf 行之后添加了 fclose(writeFile) 。我还必须将 free(binary) 行移到之后(对于任何好奇的人),这似乎已经做到了。
  • 不客气。每次循环迭代都可以打开和关闭同一个文件,但没有必要;对于性能和一般来说,让它从外部打开会更好,就像你对 inputFile 指针所做的那样。 fprintf() 每次都会自动移动 writeFile 指针,因此它会自行跟踪接下来要写入的位置。使用缓冲区卢克,;) 它是你的朋友而不是你的敌人。
猜你喜欢
  • 2020-11-02
  • 1970-01-01
  • 2018-10-03
  • 2022-01-13
  • 1970-01-01
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多