2010-05-09 12 views
10

Używam C, a moja wiedza jest bardzo prosta. chcę zeskanować plik i uzyskać zawartość już po pierwszej lub drugiej linii ...Jak pominąć pierwszy wiersz podczas fscanowania pliku .txt?

Próbowałem:

fscanf(pointer,"\n",&(*struct).test[i][j]); 

Ale ta składnia po prostu zaczyna się od pierwszej linii = \

Jak to jest możliwe ?

Dzięki.

Odpowiedz

13

fgets dostanie jedną linię i ustaw wskaźnik pliku zaczynający się na następny wiersz. Następnie możesz zacząć czytać, co chcesz po pierwszej linii.

char buffer[100]; 
fgets(buffer, 100, pointer); 

Działa tak długo, jak pierwsza linia ma mniej niż 100 znaków. W przeciwnym razie musisz sprawdzić i zapętlić.

+0

Dzięki temu działa doskonale! – NLed

+0

Dzięki, stworzyłem pytanie, a następnie je skasowałem i znalazłem tutaj odpowiedź :) – Bionix1441

12

Nie jest jasne, co starasz się przechowywać swoje dane w więc to nie jest łatwe do odgadnięcia odpowiedzi, przy okazji można po prostu pominąć bajtów aż pójdziesz na \n:

FILE *in = fopen("file.txt","rb"); 

Następnie można albo pominąć całą linię z fgets ale to jest niebezpieczne (bo trzeba oszacować długość linii a priori), inaczej używać fgetc:

uchar8 c; 
do 
    c = fgetc(in); 
while (c != '\n') 

Wreszcie należy mieć formatu specyfikatory wewnątrz fscanf właściwie analizować dane, jak

fscanf(in, "%f", floatVariable); 

można odnieść here dla specyfikatorów.

+0

Dzięki za odpowiedź, próbowałem użyć '' rb "', ale to nie działało :( Dziękuję za link do specyfikacji, jestem sprawdzanie ich teraz – NLed

+3

To nie powinno być "rb", ale po prostu "r" – Casey

+0

http://www.cplusplus.com/reference/clibrary/cstdio/fopen/ – Casey

2

fgets będzie działać tutaj.

#define MAX_LINE_LENGTH 80 

char buf[MAX_LINE_LENGTH]; 

/* skip the first line (pFile is the pointer to your file handle): */ 
fgets(buf, MAX_LINE_LENGTH, pFile); 

/* now you can read the rest of your formatted lines */ 
24

udało mi się pominąć linie z scanf z poniższej instrukcji:

fscanf(config_file, "%*[^\n]\n", NULL); 

ciąg formatu reprezentuje wiersz zawierający dowolne znaki ze spacjami. * W łańcuchu formatu i wskaźnik NULL oznaczają, że nie jesteśmy zainteresowani zapisywaniem linii, ale tylko zwiększaniem pozycji pliku.

format string wyjaśnienie:
% to postać której każdy ciąg formatu scanf zaczyna;
* wskazuje na to, aby nie umieszczać znalezionego wzoru w dowolnym miejscu (zazwyczaj zapisujesz wzorzec znaleziony w parametrach po ciągu formatu, w tym przypadku parametr ma wartość NULL);
[^\n] oznacza dowolną postać z wyjątkiem nowej linii;
\n oznacza newline;

, więc [^\n]\n oznacza pełną linię tekstu kończącą się znakiem nowej linii.

Numer referencyjny here.

+1

To jest najbardziej minimalne rozwiązanie i działa świetnie, dzięki! –

+0

To jest wspaniałe !, ale naprawdę nie rozumiem.Jeśli możesz wyjaśnić więcej, to pomoże więcej osób takich jak ja. Nigdy nie widzę ''% * [^ \ n] \ n "' przed. – buzhidao

+0

@buzhidao the ' * 'instruuje' fscanf' (wszystkie z rodziny 'scanf', w rzeczywistości) do parsowania danych, jak przedstawiono w łańcuchu formatu, ale NIE do przechowywania go pod dowolnym adresem docelowym (co jest dobre, ponieważ nie ma żadnego lista argumentów). "[^ \ n]" oznacza tak e wszystko * oprócz * nowego wiersza, więc WSZYSTKIE dane będą zużyte aż do (ale nie będą zawierać) nowej linii. Na koniec, ostatnie '\ n' oznacza" i pochłonięcie (i zignorowanie) nowej linii "(po prostu zatrzymaliśmy się przy wypełnianiu specyfikacji wcześniejszego formatu). Btw, NULL nie jest wymagana na liście argumentów. – WhozCraig

Powiązane problemy