Как я могу прочитать текстовый файл с шестнадцатеричными значениями, разделенными запятыми, например 0x58,0xA9,0x00 и поместите его значения как элементы массива, например LR0 Мне нужно заменить это жестко запрограммированным чтением из файла:

const unsigned char LR0[] = {0x58,0xA9,0x00}

Вот что я написал до сих пор. printf("%c", ch); показывает мне, что мне нужно, но когда я раскомментирую strcat(LR0, ch);, во время выполнения происходит сбой с segment fault. Я не знаю, следует ли мне использовать strcat или что-нибудь еще для добавления элементов этого массива LR0.

#include <stdio.h>                                                                                                                                                                                                   
#include <stdlib.h>                                                                                                                                                                                                  
#include <string.h>                                                                                                                                                                                                  

int main() {                                                                                                                                                                                                         
   int ch;                                                                                                                                                                                                           
   FILE *fp;                                                                                                                                                                                                         
   //const unsigned char LR0 [1024] = "";                                                                                                                                                                            
   const unsigned char LR0 [] = {};                                                                                                                                                                                  
   fp = fopen("test.txt", "r");                                                                                                                                                                                      
   if (fp == NULL)                                                                                                                                                                                                   
   {                                                                                                                                                                                                                 
      perror("Error while opening the file.\n");                                                                                                                                                                     
      exit(EXIT_FAILURE);                                                                                                                                                                                            
   }                                                                                                                                                                                                                 
   while((ch = fgetc(fp)) != EOF){                                                                                                                                                                                   
      printf("%c", ch);                                                                                                                                                                                              
      //strcat(LR0, (char) ch);                                                                                                                                                                                             
   }                                                                                                                                                                                                                 
   fclose(fp);                                                                                                                                                                                                       
   return 0;                                                                                                                                                                                                         
}

Извините, поэтому простой вопрос, который невозможно исправить с помощью поиска в Google и т. Д. Я не разработчик C и использую gcc в Linux. Мой текстовый файл не содержит строк, поэтому я не могу использовать это решение

c
4
gmaxin 17 Сен 2018 в 09:46

2 ответа

Лучший ответ

const unsigned char LR0 [] = {}; подразумевает массив нулевой длины - это не является стандартом C, но разрешено некоторыми компиляторами.

strcat(LR0, (char) ch); пытается: 1) записать в массив const LR0 и 2) записать вне массива - длина всего 0. Оба являются неопределенным поведением (UB).

Я не знаю, следует ли мне использовать strcat

Использование функций str...() плохо обрабатывает ввод, который может содержать много "0x00, 0x00, ...".


Как я могу прочитать текстовый файл с шестнадцатеричными значениями, разделенными запятыми, например 0x58,0xA9,0x00 и поместить его значения как элементы массива (?)

Прочтите файл, чтобы определить его длину и содержимое. Я предлагаю пропуск для каждого.

Приведенное ниже не проверено, но, надеюсь, достаточно для начала OP. В нем мало ошибок.

// Parse a text file like  "0x58,0xA9,0x00"
// Return byte count.  Return 0 on error.
size_t read_comma_hex(FILE *f, unsigned char *dest, size_t num) {
  rewind(f);
  size_t i;
  for (i = 0; i<num; i++) {
    if (i) {
      int ch = fgetc(f);

      // Add to tolerate white space before the ',' or after the the last number
      while (isspace(ch)) {
        ch = fgetc(f);
      }

      if (ch == EOF) break;    // no more data
      if (ch != ',') return 0; // Fail, as ',' expected
    }
    unsigned char hex;
    if (fscanf(f, "0x%hhx", &hex) != 1) return 0;   
    if (dest) dest[i] = hex;
  }
  return i;
}

void read_comma_hex_file(FILE *f) {
  size_t n =  read_comma_hex(f, NULL, SIZE_MAX);
  if (n == 0) return; // no data or failure

  // OP wants an array - research variable length array
  const unsigned char LR0[n];
  // Alternative: allocate memory instead of using an _array_. (not shown)

  // Read data into the array  
  read_comma_hex(f, LR0, n);

  // use LR0 and n some how
  for (size_t i = 0; i<n; i++) {
    printf("0x%02hhX%s", LR0[i], i > 0 ? "," : "");
  } 
}
1
chux - Reinstate Monica 19 Сен 2018 в 15:44

В вашем коде есть две проблемы.

  1. LR0 объявлен как const с неопределенным размером, который является просто указателем, запись в него может привести к UB.
  2. strcat нуждается в аргументах как тип char *, но ваш второй аргумент имеет тип char (int ch;).

    strcat(LR0, (char) ch)

Вы можете использовать fscanf с , в качестве разделителя, как показано ниже, чтобы читать только значения hex, отбрасывая ,.

int main() {                                                                                                                                                            
    FILE *fp;                                                                                                                                                            
    unsigned char LR0 [1024] = {};                                                                                                                                          
    fp = fopen("test.txt", "r");                                                                                                                                         
    if (fp == NULL) {                                                                                                                                                                    
        perror("Error while opening the file.\n");                                                                                                                        
        exit(EXIT_FAILURE);                                                                                                                                               
    }

    int i = 0;                                                                                                                                                          
    while(fscanf(fp, "%c,", &LR0[i]) == 1){                                                                                                                                
        printf("%c", LR0[i++]);                                                                                                                                           
    }

    fclose(fp);                                                                                                                                                          
    return 0;                                                                                                                                                            
}
2
chux - Reinstate Monica 17 Сен 2018 в 07:44