MaranX Temat założony przez niniejszego użytkownika |
[C] Wczytywanie wybranego wiersza z pliku tekstowego » 2013-05-15 17:16:26 Witam. Niedawno wykonałem program, w języku C, polegający na wczytywaniu tekstu z pliku, a następnie wypisywanie na ekranie terminala wybranego przez użytkownika wiersza. Wiersze wczytuje komendą fgets do zmiennej wskaźnikowej char* wiersz[n], gdzie n to numer wiersza, a p to całkowita liczba wierszy + 1. Każdy wiersz ma co najwyżej 512 bajtów: for( n = 0; n < p; n = n + 1 ) { wiersz[ n ] = malloc( 511 ); fgets( wiersz[ n ], 511, plik ); }
W każdym wierszu pliku tekstowego jest informacja na temat jednego pojęcia, które wypisuje użytkownik. Niestety nauczycielowi nie podobało się, że plik tekstowy wczytuje się cały i w ten sposób obciąża pamięć RAM. Dlatego powiedział bym go zmodyfikował w taki sposób, aby wczytywał jedynie pojęcia (pierwsze słowa w wierszu) a następnie, po wpisaniu tego pojęcia, wczytywał cały wiersz i wypisywał jego zawartość na ekranie. Z konsultacji odnośnie tego problemu dowiedziałem się, że w języku C niemożliwe są operacje na pliku tekstowym bez jego uprzedniego całkowitego wczytania przez program. Oczywiście mogę wczytać plik do pewnego momentu, lub podzielić go komendą "strok" już po wczytaniu. Niestety w ten sposób mój program nie spełni wymagań. Moje pytanie brzmi, czy istnieje format pliku tekstowego (inny niż .txt), lub biblioteka, która pozwala na takie operacje? Bardzo bym prosił o odpowiedź. |
|
DejaVu |
» 2013-05-15 17:20:49 Z konsultacji odnośnie tego problemu dowiedziałem się, że w języku C niemożliwe są operacje na pliku tekstowym bez jego uprzedniego całkowitego wczytania przez program. Oczywiście mogę wczytać plik do pewnego momentu, lub podzielić go komendą "strok" już po wczytaniu
|
Można wczytywać fragmenty plików zarówno w C jak i w C++. Niemniej jednak skoro masz zmienną długość wiersza, a nie stałą, np. 512 znaków, to nie da rady wczytywać 'fragmentów' plików, bowiem nie wiadomo, gdzie się kończy, a gdzie zaczyna wiersz.
http://www.cplusplus.com/reference/cstdio/fseek/ |
|
MaranX Temat założony przez niniejszego użytkownika |
» 2013-05-15 18:08:56 Rozumiem. A czy istnieje możliwość wczytywania wiersza do jednej zmiennej typu char[] i sprawdzenia czy pierwsze słowo zgadza się z wpisanym pojęciem? W ten sposób definicja byłaby znaleziona bez potrzeby obciążania pamięci RAM. |
|
DejaVu |
» 2013-05-15 18:15:18 char napis[ 1024 ]; if( fscanf( plik, "%s", napis ) > 0 ) { }
|
|
MaranX Temat założony przez niniejszego użytkownika |
» 2013-05-15 18:37:30 Bardzo dziękuję za odpowiedź, nie spodziewałem się, jej aż tak szybko :) Na szczęście udało mi się napisać kod po swojemu: while( fgets( wiersz, 512, plik ) != NULL ) { fragment = strtok( wiersz, separator ); if( strcmp( fragment, komenda1 ) == 0 ) { while( fragment != NULL ) { printf( "%s", fragment ); if( strcmp( fragment, komenda1 ) == 0 ) printf( " - " ); fragment = strtok( NULL, separator ); } printf( "\n" ); } }
Seperator to znak co odseparowuje pojęcie od definicji, fragment to fragmenty tekstu, w tym przypadku po wczytaniu pojęcia sprawdza się czy zgadza się z pojęciem w danym wierszu. Jeśli tak to jest wypisywane pojęcie i z tego samego wiersza, definicja. |
|
« 1 » |