2012-11-04 18 views
12

Mam fscanf do odczytu linii ustawienia z pliku konfiguracyjnego. Ustawienia te są ściśle ustalonym formacie, który wygląda jakfscanf i znak nowej linii

name1=option1; 
name2=option2; 
... 

więc w zasadzie zrobić

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

gdzie konfiguracja jest strumień i nazwa pliku i opcja programowania są bufory.

Problem polega na tym, że bufor nazwy zawiera znak nowej linii, którego nie chcę. Czy w "[^ ...]" został pominięty specyfikator formatu, aby pominąć znak nowego wiersza? W każdym razie, czy można go rozwiązać poprzez specyfikator formatu?

BTW: Połknięcie znak nowej linii pisząc ten

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

nie jest elegent myślę, że na znak nowej linii może się powtórzyć więcej niż jeden raz w dowolnym miejscu.

+1

Jeśli pola 'nameN' nie mogą zawierać białych znaków, po prostu dodaj spację na początku ciągu formatu -' "% [^ =] =% [^;];" '- aby pominąć wiodące białe znaki. Jeśli to możliwe, musisz sam używać nowej linii z 'getchar()'. –

+1

Przyjęta odpowiedź jest w każdym razie słuszna, jeśli chodzi o powtórzone znaki nowej linii, można użyć '% * [\ n]', aby odczytać dowolną liczbę '\ n'' bez ich zapisywania. – effeffe

Odpowiedz

11

Wystarczy dodać spację na końcu łańcucha format:

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

to zje wszystkie białe znaki, w tym nowej linii.

Cytat z cplusplus.com:

Znaki Niedrukowalne: funkcja odczytu i ignoruje wszystkie spacje znaki występujące przed następnym charakterze non-spacji (odstępu znaków spacji, znak nowej linii i znaków tabulacji - patrz isspace). Pojedyncze białe znaki w łańcuchu formatów walidują dowolną ilość białych znaków wyodrębnionych ze strumienia (w tym brak).

+0

To świetnie. Dzięki. – Yang

1

to będzie działać:

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

Trzeba będzie zużywać nowa linia character.Otherwise, znak nowej linii pozostaje w strumieniu wejściowym.

+0

hmm ... więc jak duży powinien być manekin? Wystarczająco duże, aby połknąć wszystkie możliwe znaki nowej linii? – Yang

+0

Ponieważ powiedziałeś, że masz ściśle zdefiniowany format danych wejściowych, możesz obliczyć nie. dokładnie wymaganych postaci i utworzyć zmienną dummy. To pomoże ci znaleźć wszelkie możliwe odchylenia od formatu wejściowego, a raczej je pominąć (co stanie się, jeśli użyjesz spacji, przed lub po fscanf lub fgets). – askmish

+1

Na końcu brakuje '% ', w każdym razie dlaczego nie używać'% [^ =] =% [^;];% * [^ \ n] 'i zapomnieć o nowych znakach i buforze, aby je zawrzeć? – effeffe

6

Alternatywą jest użycie fgets() przeczytać całą linię na ciąg znaków, a następnie użyć sscanf(). Ma to tę zaletę w debugowaniu, że można dokładnie zobaczyć, jakie dane działa funkcja.

Powiązane problemy