Ustawienie indeksów na kolejne wiersze w pliku txt, zapisane jako tablica

0

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

0

Co to znaczy ustawić indeksy?

0

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

0

Nie, nie można. Aby móc operować na danych z pliku, najpierw musisz je załadować do pamięci.

0

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

0

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.

0
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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1