Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C] Wczytywanie wybranego wiersza z pliku tekstowego

Ostatnio zmodyfikowano 2013-05-15 18:37
Autor Wiadomość
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:
C/C++
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ź.
P-83015
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.

Frazy, które należy wpisać w wyszukiwarkę google:

http://www.cplusplus.com/reference/cstdio/fseek/
P-83017
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.
P-83026
DejaVu
» 2013-05-15 18:15:18
C/C++
char napis[ 1024 ];
if( fscanf( plik, "%s", napis ) > 0 )
{
    //udało się wczytać napis
}
P-83029
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:
C/C++
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.
P-83031
« 1 »
  Strona 1 z 1