C программа ожидает, когда она должна добавить - PullRequest
0 голосов
/ 10 февраля 2019

Попытка написать программу на 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 возвращаетшестнадцатеричный символ как символ * его двоичного представления (например, binNum = [0] [0] [0] [0]).Это действительно долго, поэтому я бы предпочел не ставить его здесь, но могу, если это поможет.

Когда входной файл:

000a
a000

Выходной файл:

1010000000000000
0000000000001010

Спасибо

1 Ответ

0 голосов
/ 10 февраля 2019

Ваш цикл вызывает fopen () каждую итерацию и никогда не закрывает и не очищает этот файловый поток.Записи буферизуются, ожидая заполнения или очистки буфера или закрытия файла;поэтому в следующий раз, когда вы вызовете fopen (), вы получите тот же указатель, что и в первый раз.

Вам повезло, что он не падает.:) Не вызывайте fopen () повторно.Вызовите его один раз за пределами цикла, используйте внутри или переместите указатель, а затем верните за пределы вызова fclose ().

...