Чтение файла, содержащего несколько строк строк, целых чисел и чисел с плавающей точкой - PullRequest
0 голосов
/ 07 апреля 2019

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

Мне удалось прочитать первые две части данных. Это поплавок вызывает у меня проблемы.

Вот пример того, что я пытаюсь прочитать:

CHANNEL_1, 0, 0,453

char        CHANNEL_NAME_[BUF_SIZE];
uint32_t    val1_;
double      val2_;
    FILE *fp;
int c;

    fp = fopen("E:\\read_from_file\\config.cfg", "r");

if (fp < 1)
{
    printf("Failed to open file = %d\n", fp);
    fclose(fp);
}

c = fscanf(fp, "%[^,], %u[^,], %lf", CHANNEL_NAME_, &val1_, &val2_);

printf("[%s] [%u] [%lf]\n", CHANNEL_NAME_, val1_, val2_);
printf("C = %d\n", c);

Я могу правильно напечатать строку и целое число, но это проблема с плавающей точкой. Выдается как случайное число с плавающей точкой, что-то вроде 34534524524523452345.0000000. Я ожидаю увидеть поплавок, как указано выше, 0,453.

Когда я печатаю C, который является результатом fscanf, я получаю 2, что неверно, так как я ожидаю прочитать 3, из-за 3 типов данных, читаемых в.

Что я делаю не так?

1 Ответ

2 голосов
/ 07 апреля 2019

Нет такого спецификатора, как "%u[^,]".Этот формат обрабатывается как отдельный "%u", за которым следует отдельный "[^,]".

. Формат %[ читает только строки, он не имеет префикса типа (и не нужен как scanf прекратит чтение целых чисел с первого нецифрового символа на входе).Это означает, что вы можете использовать только "%u" для среднего спецификатора:

c = fscanf(fp, " %[^,], %u, %lf", CHANNEL_NAME_, &val1_, &val2_);

Обратите внимание, что я добавил начальный пробел в строке формата.Это связано с тем, что формат "%[" не пропускает начальные пробелы (как и любые возможные символы новой строки после предыдущей строки).


С помощью спецификатора формата "%u[^,]" функция фактически пытается найти точную последовательность "[^,]" на входе, который он не найдет, что приведет к тому, что последнее значение не будет прочитано.Следовательно, значение c равно 2 (поскольку fscanf соответствует только двум значениям: исходной строке и первому целому числу без знака).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...