[#1] [C++] Odczyt/skakanie po pliku tekstowym
Przyszedl czas zaliczen projektow na programowanie i mam problem. Mam zrobic program ktory z pliku tekstowego wybierze losowo jakies zdania i ulozy z nich horoskop. Zrobilem juz rozpoznanie znaku za pomoca daty wprowadzonej z linii komend, funkcja RozpoznajZnak() zwraca numer znaku (1 Koziorozec, 2 Wodnik itd) pozniej przekazuje ja dalej. W zaleznosci: Jesli data jest wprowadzona poprawnie to generuje dla tego znaku a jesli jest blednie podana to ma wygenerowac dla wszystkich i zapisac do pliku. Tak sie przedstawia zarys tego projektu. I teraz pytania.

Zrobilem baze zdan. Czy mam otworzyc plik z parametrami "r" czy "rb"? Chcialbym alby bylo cos takiego, ze losuje zdanie, pobiera mi z pliku cala linijke tekstu i wyrzuca ja na ekran [nie chce kombinowac z tym ze pobiera mi tekst az natrafi na wartosc 13 (enter)]. Jest jakas funkcja ktora pozwala skakac po pliku tekstowym [ale nie fseek()] tzn np. przeskoczyc o dana liczbe wierszy



Ostatnia modyfikacja: 10.01.07 11:17
[#2] Re: [C++] Odczyt/skakanie po pliku tekstowym

@Lorak, post #1

Jest jakas funkcja ktora pozwala skakac po pliku tekstowym [ale nie fseek()] tzn np. przeskoczyc o dana liczbe wierszy

Z tego, co mi wiadomo, nie ma. Pozostaje zawsze fseek() do początku (albo ponowne otwarcie) i fgets() w pętli. W przypadku wymaganej dużej szybkości działania można zawsze przeskanować plik i zapamiętać offsety początków zdan w tablicy (albo wręcz załadować cały plik do pamięci i stablicować wskaźniki do początków zdań).

[#3] Re: [C++] Odczyt/skakanie po pliku tekstowym

@Lorak, post #1

Tak to panu dopasuja tylko w erze.... Albo musisz stablicowac sobie poczatki linii, albo otwierac binarnie i miec stala dlugosc znakow na linie.

[#4] Re: [C++] Odczyt/skakanie po pliku tekstowym

@Grzegorz Kraszewski, post #2

załadować cały plik do pamięci i stablicować wskaźniki do początków zdań

Chyba kumam o co chodzi. Zrobic tablice wskaznikow a pozniej przy losowaniu zdania odwolywac sie do jakiejs komorki tej tablicy wskaznikow. Tylko jak ja utworzyc? To maja byc wskazniki typu char ale w opcjach kompilatora zaznaczyc ze maja byc tzw. dlugie (czy jakos tak)? (Baza zdan nie przekroczy 64kB). Czy dobrze mysle jesli zrobie w ten sposob:

do
{
    while(fgetc!=13)
    {
    fseek(plik, 1, 1);
    }
    indekswskaznika++;
    fseek(plik 2, 1)  //przeskok o 2 bajty do poczatku nowego zdania
}
while(fgetc!=EOF);


i teraz trzeba pewnie przypiac ten poczatek do wskaznika. Jak???

Jak zadeklarowac tablice wskaznikow? czy jakos tak:

#define ILESTAM 256
char *wskazniki[ILESTAM]




Ostatnia modyfikacja: 10.01.07 12:03
[#5] Re: [C++] Odczyt/skakanie po pliku tekstowym

@Lorak, post #4

Ja bym tego tak nie robił. Najpierw bym zbadał długość pliku. Potem zaalokował pamięć na cały plik i go jednym fread() tam załadował. Następnie traktując bufor jako char[] wyszukiwałbym kolejne linie już w pamięci. Przy okazji w sekwencji CRLF zastępowałbym znaki CR zerami, dzięki czemu miałbym teksty zakończone kodem zero, jak tego np. printf() się spodziewa.

[#6] Re: [C++] Odczyt/skakanie po pliku tekstowym

@Lorak, post #4

jak chcesz wczytac do pamieci caly plik to mozesz wziasc vector i tam wczytac stringi linijka po linijce.



Ostatnia modyfikacja: 10.01.07 12:28
[#7] Re: [C++] Odczyt/skakanie po pliku tekstowym

@Grzegorz Kraszewski, post #5

Przy okazji w sekwencji CRLF zastępowałbym znaki CR zerami,

Czy ta sekwencja CRLF to te 2 bajty przez ktore chcialem przeskoczyc? Jesli tak to swietny pomysl :D

zaalokował pamięć na cały plik

Chodzi o tego malloca()? Musze sie w koncu tego nauczyc ;)

[#8] Re: [C++] Odczyt/skakanie po pliku tekstowym

@Lorak, post #7

Masz tutaj przykład, tylko niektórymi komentarzami się nie przejmuj, bo dopisywałem dla jednego ajbiemowca.
http://shg.ovh.org/temp/loadTXT.c

Mam gdzieś jeszcze to samo, ale z poprawnym traktowaniem wszystkich kombinacji CR i LF, jak znajdę to dorzuce.
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem