2013-03-08 14 views
5

Próbuję odczytać plik sformatowany w ten sposób ogólny:C - fscanf Mixed Numbers i statycznych Tekst

Text Description: 12 
Description2: 1 
More descriptive things: 6 

i chciałbym zapoznać się z numerami 12, 1 i 6 do zmiennych.

Próbowałem kodu:

fscanf(fptr, "Text Description:%d",&desc1); 
fscanf(fptr, "Description2:%d",&desc2); 
fscanf(fptr, "More descriptive things:%d",&desc3); 

Ale z jakiegoś powodu tylko pierwsza zmienna jest zaludnionych. Czy ktoś wie, dlaczego tak się dzieje?

Odpowiedz

1

spacji na początku formacie ciąg, aby uniknąć nowe problemy linia

fscanf(fptr, " Text Description:%d",&desc1); 
fscanf(fptr, " Description2:%d",&desc2); 
fscanf(fptr, " More descriptive things:%d",&desc3); 
+2

'% d' już zużywa całą poprzednią białą przestrzeń. Jedynymi '%', które nie zużywają białych znaków są '% c' i'% ['. – Shahbaz

+0

w takim przypadku ma on tylko dodać spację na początku formatu ciągu. Dziękuję za odpowiedź na uwagę – MOHAMED

0

Nie czytasz nowej linii po przetworzeniu liczby 12, więc pozostałe dwa wywołania znajdują się zamiast łańcucha lub liczby całkowitej, a zatem zawodzą. Możesz użyć spacji w następnym wywołaniu fscanf (która zużywa wszystkie znaki odstępu poprzedzające ciąg, który chcesz dopasować). Ewentualnie możesz go spożywać, dzwoniąc pod numer fgetc, o ile każda linia kończy się natychmiast linkiem, np.

fscanf(fptr, "Text Description:%d",&desc1); 
fgetc(fptr); // drop the next character 
fscanf(fptr, "Description2:%d",&desc2); 

Usunięcie wszystkich wprowadzonych strumienia po całkowitej i do następnego „\ n” można zrobić z pętlą Zamiast:

while (fgetc(fptr) != '\n') 
    ; 
+0

bym dodaj '&& feof (fptr)' do pętli while tylko w przypadku (a może sprawdzić za 'ferror' zbyt jeśli jesteś zbyt paranoidalny;) – Shahbaz

+0

@Shahbaz: yeah! , ale zakładam, że ten plik wejściowy jest taki, jak podano. Będzie potrzebował wielu sprawdzeń dla niewiarygodnych plików wejściowych. – teppic

+0

Lepsze sprawdzenie przed 'EOF'. Wywołanie 'feof' bez znalezionego' EOF' byłoby błędne. – md5