• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Odczyt linii z pliku tekstowego (7 odcinek C++)

Object Storage Arubacloud
0 głosów
1,094 wizyt
pytanie zadane 26 marca 2021 w Nasze poradniki przez Dawidziu Bywalec (2,610 p.)
Chciałbym się dowiedzieć na jakiej zasadzie działa odczyt plików z 7 odcinka kursu C++ (ok. 11 minuta). Autor filmu nie podaje żadnych informacji jaka linia ma być aktualnie odczytana, a mimo to program odczytuje linie, ponadto z każdym powtórzeniem odczytuje linię następną. Czy była by w takim razie możliwość odczytania konkretnej, wybranej linii? Tzn. chcę odczytać tylko linię 7, pomijając linie od 1 do 6, lub kiedy program odczytał linie od 1 do 9, to czy mogę wrócić np. do linni 6?

1 odpowiedź

+2 głosów
odpowiedź 26 marca 2021 przez Michał Muzyka Pasjonat (24,080 p.)
wybrane 26 marca 2021 przez Dawidziu
 
Najlepsza
System windows tworzy w pamięci strukturę opisującą plik. I zwraca do niej uchwyt, język c++ obudowuje to w klasę fstream, w tej strukturze opisywana jest np. pozycja w pliku. Plik widziany jest jako strumień, co to oznacza, czyli taki getline czyta aż w pliku nie napotka znaku EOL ('\n') i przestawia aktualną pozycję w pliku o tyle ile przeczytał za znak '\n', wywołując znowu getline od aktualnej pozycji, plik czytany jest do następnego wystąpienia, znaku '\n' potem znowu przestawiana pozycja w pliku i tak w kółko, dlatego nie podajemy numeru linii tylko czytamy kolejne.
Teoretycznie jest coś takiego możliwe, np. jeżeli mamy ustaloną stałą długość linii możemy sami przestawiać pozycję w pliku przy użyciu funkcji seekg, lecz nie jest to wyrażane przy użyciu numeru linii, a liczby bajtów
komentarz 26 marca 2021 przez kacper1445 Gaduła (4,880 p.)
Popraw mnie jeżeli się mylę, ale można również zliczać znaki '\n' i na tej podstawie stworzyć funkcję która przeniesie nas do danej linijki.
2
komentarz 26 marca 2021 przez Michał Muzyka Pasjonat (24,080 p.)
tak jest to możliwe, ale prościej będzie zapisywać pozycję każdej linii przy użyciu tellg i tak przeskakiwać do danego numeru linii, bardziej chodziło mi o sytuacje w której np. wiemy, że plik ma np. 50 linii stałej długości i chcemy odczytać tylko szóstą
komentarz 26 marca 2021 przez Dawidziu Bywalec (2,610 p.)
Nie do końca wszystko zrozumiałem, aczkolwiek najważniejszą dla mnie kwestię tak, więc dziękuję za pomoc.
komentarz 26 marca 2021 przez Michał Muzyka Pasjonat (24,080 p.)
może Pan pytać, postaram się wytłumaczyć
komentarz 27 marca 2021 przez Dawidziu Bywalec (2,610 p.)
Chodzi o tę funkcję seekg, jednak najważniejsza była dla mnie kwestia zrozumienia działania instrukcji getline.
komentarz 27 marca 2021 przez Michał Muzyka Pasjonat (24,080 p.)
tak jak pisałem przechowywana jest informacja o aktualnej pozycji w pliku, przy użyciu tellg możemy odczytać wartość tej pozycji, a przy użyciu funkcji seekg, możemy przestawić się na daną pozycję w pliku. Jednak jeżeli nie wiemy jak wygląda plik, możemy nie trafić w początek linii, albo w ogóle wyjść poza plik np plik wygląda tak (tak sobie go wyobrażamy jak otwieramy go w notatniku):
AAAAA
AA
A
AAAA
ale nasz program widzi to tak (jako strumień danych):
AAAAA\r\nAA\r\nA\r\nAAAA\r\n

(tutaj może Pan się zdziwić tymi znakami \r\n ale windows tak interpretuje znak nowej linii w plikach)

no to pierwsza linijka pliku zaczyna się od pozycji 0, druga 7, trzecia 11, czwarta 14
i jeżeli znamy te konkretne wartości to nie ma problemu żeby odczytać trzecią linijkę, ustawiamy się przy użyciu seekg na 11 pozycję i czytamy całą linię (czyli do znaków '\r\n').
komentarz 27 marca 2021 przez Dawidziu Bywalec (2,610 p.)
I jak tę funkcję wpisuje się w kodzie? Załóżmy, że chcę odczytać plik od drugiej linii, czyli w tym przypadku, jak Pan napisał od 7 znaku.
komentarz 27 marca 2021 przez Michał Muzyka Pasjonat (24,080 p.)

np. jeżeli chcemy odczytać tylko drugą linię (od 7 znaku):

#include <iostream>
#include <fstream>
#include <string>

int main(){
  const int line_pos = 7;
  std::string line;

  std::ifstream file("file.txt");
  if(file.is_open()){
     file.seekg(line_pos); 
     std::getline(file, line);
     std::cout<< line << std::endl;
     file.close();
  }

  return 0;
}

proszę utworzyć podobny plik i uruchomić podany kod

komentarz 27 marca 2021 przez Dawidziu Bywalec (2,610 p.)
Ok, dzięki wielkie za pomoc.

Podobne pytania

0 głosów
1 odpowiedź 480 wizyt
pytanie zadane 13 sierpnia 2019 w C i C++ przez Bulbi Początkujący (250 p.)
+4 głosów
2 odpowiedzi 15,116 wizyt
+1 głos
1 odpowiedź 691 wizyt
pytanie zadane 27 września 2020 w Mikrokontrolery przez krzysieq18 Nowicjusz (230 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...