C程序会在需要追加的时候添加前缀

时间:2019-02-10 00:07:54

标签: c append prepend

尝试用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

谢谢

1 个答案:

答案 0 :(得分:4)

您的循环在每次迭代时都调用fopen(),并且从不关闭或刷新此文件流。写缓冲,等待缓冲区填充或刷新或关闭文件;因此,下次调用fopen()时,您将获得与第一次相同的指针。

您很幸运,它没有崩溃。 :)不要重复调用fopen()。在循环外,在内部使用或将指针移到上方,在外部调用fclose()一次调用它。