Fscanf и символ новой строки
У меня есть fscanf для чтения строк настройки из файла конфигурации. Эти настройки имеют строго предопределенный формат, который выглядит как
name1=option1;
name2=option2;
...
так что в основном я делаю
fscanf(configuration,"%[^=]=%[^;];",name,option);
где конфигурация - это поток файлов, а имя и параметр - буферы программирования.
Проблема заключается в том, что буфер имен содержит символ новой строки, который я не хочу. Есть ли спецификатор формата, который я пропустил в "[^...]", чтобы пропустить символ новой строки? Во всяком случае, можно ли это решить с помощью спецификатора формата?
BTW: проглатывание символа новой строки, называя это
"%[^=]=%[^;];\n"
не является изящным. Я думаю, что символ новой строки может повторяться более чем раз.
Ответы
Ответ 1
Просто добавьте пробел в конец строки формата:
"%[^=]=%[^;]; "
Это будет использовать все пробельные символы, включая новые строки.
Цитата из cplusplus.com:
Символ пробела: функция будет считывать и игнорировать любые пробельные символы, встречающиеся перед следующим небелосовым символом (пробельные символы включают пробелы, символы новой строки и символы табуляции - см. isspace). Единое пробеливание в строке формата проверяет любое количество пробельных символов, извлеченных из потока (в том числе ни одного).
Ответ 2
Альтернативой является использование fgets()
для чтения всей строки в строке, затем используйте sscanf()
. Это имеет преимущество при отладке, поскольку вы можете точно видеть, какие данные работают над функцией.
Ответ 3
Это будет работать:
fscanf(configuration,"%[^=]=%[^;];%[^\n]",name,option,dummy);
Вам придется использовать новый символ строки. В противном случае строка новой строки останется во входном потоке.