Mam pytanie, czy można ustawić indeksy na kolejne wiersze w pliku txt zapisane jako tablica(typu int) bez konieczności zaczytywania pliku do tablicy znakowej
Co to znaczy ustawić indeksy
?
Np. mam plik.txt z danymi:
Piotr
Paweł
Ania
Rafał
...
I chcę ustawić indeksy na dany wiersz z pliku np.
tab[]
Piotr ----> 1
Paweł -----> 2
Ania ------> 3
...
tab[1,2,3,n...]
Tak żeby np pętla startowała z czytaniem pliku dopiero od wiersza o indeksie 3 do np 5 a nie od początku do końca
Nie, nie można. Aby móc operować na danych z pliku, najpierw musisz je załadować do pamięci.
a co w przypadku jeżeli za alokowanie tak dużej ilości pamięci jest nie możliwe ponieważ wartości muszą być dostępne na stałe
To zależy jak te dane chcesz przetwarzać.
- Możesz plik posortować alfabetycznie i trzymać np. w
unordered_map< char, std::size_t >
gdzie kluczem jest pierwsza litera a wartością offset od którego dane się zaczynają - Możesz plik przeskanować i zrobić
unordered_map< std::size_t, std::size_t >
gdzie klucz to numer wiersza a wartość to offset w pliku
Wtedy możesz wczytać tylko ten kawałek pliku, który Cię interesuje.
Kanterin napisał(a):
a co w przypadku jeżeli za alokowanie tak dużej ilości pamięci jest nie możliwe […]
Nigdzie nie napisałem, że masz ładować cały plik do pamięci. Zresztą nie tylko Ty nie zrozumiałeś mojego posta.
Nie możesz operować na danych z pliku, jeśli ich nie wczytasz do pamięci. Nieważne jakie to są dane i ile ich potrzebujesz w danym momencie – musisz je wczytać do pamięci. Dopiero wtedy możesz cokolwiek z nimi zrobić.
[…] ponieważ wartości muszą być dostępne na stałe
W takich przypadkach otwiera się plik i ładuje tylko te dane, które są wymagane w danym momencie.
Przy czym wczytywanie danych z różnych miejsc pliku tekstowego (nie po kolei wierszami) jest dość skomplikowane, jeśli nie ma się dostępnego jakiegoś API. Bo nie da się z góry określić pozycji pierwszego znaku w konkretnej linii, a tym samym przesunąć wskaźnik w pliku na konkretny bajt. Trzeba to liczyć w locie, wczytując dane kawałek po kawałku i szukać znaków/sekwencji znaków końca linii, ew. czytać dane wierszami dotąd, aż dojdzie się do tego konkretnego.
Co innego, gdy każda linia pliku tekstowego ma z góry okresloną długość i nie wpływa na nią użyte kodowanie znaków. Jednak bieżący problem nie pasuje do tych kryteriów.
Przy okazji – tablice w C indeksowane są od 0
do n-1
, nie od 1
do n
.