0

Есть код, считывающий конфигурацию из текстового файла. Содержимое файла (значения, разделенные пробелами):

100 1690 Var1 A 1 0 0
101 1694 Var2 A 1 0 0
102 1698 Var3 A 1 0 0
1000 1000 Var4 na 1 0 0
1001 1001 Var5 na 1 0 0
5000 2807 Var6 na 1 0 0

Файл читаю в цикле:

FILE *fp;

if ((fp = fopen(config, "r")) == NULL) {
  printf("Can not open config file %s\n", config);
  return -1;
}

int var_ioa;
int var_id;
char var_name[255];
char   mu[10];
bool sporadic;
float cyclic_interval;
char aperture[10];
var_meas_unit var_mu;
while (!feof(fp)) {

  fscanf(fp, "%d%d%s%s%d%f%s\n", &var_ioa, &var_id, var_name, mu, &sporadic, &cyclic_interval, aperture);

  printf("MU string:%s\n", mu);
 }

Проблема в следующем: если объявить переменную mu сразу после переменной var_name (как выше), то вывод программы следующий:

MU string:
MU string:
MU string:
MU string:
MU string:
MU string:

Если же объявление переменных сделать таким (mu последняя в списке):

int var_ioa;
int var_id;
char var_name[255];
bool sporadic;
float cyclic_interval;
char aperture[10];
var_meas_unit var_mu;
char   mu[10];

то результат корректный:

MU string:A
MU string:A
MU string:A
MU string:na
MU string:na
MU string:na

Почему такое поведение? Не могу понять.

messenja
  • 113
  • Что-то не воспроизводится ваша ошибка... Это весь код? не перетираете ли вы где-то что-то в var_name? Но у вас есть другая неприятность - while (!feof(fp)) – Harry Mar 14 '19 at 08:52
  • @Harry, дальше по коду переменная var_name копируется в другую область памяти, ее перезапись нигде не происходит. – messenja Mar 14 '19 at 10:06
  • Ну, приведите тогда минимальный пример, который можно запихнуть в компилятор и посмотреть... Текстовый файл именно такой, как показан? – Harry Mar 14 '19 at 10:45
  • @Harry, выложил полный код на пейстбин. Содержимое файла такое же, как выше. – messenja Mar 14 '19 at 10:57
  • Ну, хотите - верьте, хотите - нет - но у меня (VC++) все нормально... – Harry Mar 14 '19 at 11:53
  • @Harry, верю, потому что разобрался с проблемой. Все дело в типе bool (stdbool.h). Я собираю компилятором gcc под Linux, и при форматированном чтении fprintf происходит несоответствие спецификатора %d и типа bool. Объявил как int, все работает. Спасибо за участие ) – messenja Mar 14 '19 at 11:59

0 Answers0