Подтвердить что ты не робот

Fscanf и символ новой строки

У меня есть fscanf для чтения строк настройки из файла конфигурации. Эти настройки имеют строго предопределенный формат, который выглядит как

name1=option1;
name2=option2;
...

так что в основном я делаю

fscanf(configuration,"%[^=]=%[^;];",name,option);

где конфигурация - это поток файлов, а имя и параметр - буферы программирования.

Проблема заключается в том, что буфер имен содержит символ новой строки, который я не хочу. Есть ли спецификатор формата, который я пропустил в "[^...]", чтобы пропустить символ новой строки? Во всяком случае, можно ли это решить с помощью спецификатора формата?

BTW: проглатывание символа новой строки, называя это

"%[^=]=%[^;];\n"

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

4b9b3361

Ответ 1

Просто добавьте пробел в конец строки формата:

"%[^=]=%[^;]; "

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

Цитата из cplusplus.com:

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

Ответ 2

Альтернативой является использование fgets() для чтения всей строки в строке, затем используйте sscanf(). Это имеет преимущество при отладке, поскольку вы можете точно видеть, какие данные работают над функцией.

Ответ 3

Это будет работать:

fscanf(configuration,"%[^=]=%[^;];%[^\n]",name,option,dummy);

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