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

question-closed Poruszanie się po pliku txt

Object Storage Arubacloud
+1 głos
1,737 wizyt
pytanie zadane 30 lipca 2016 w C i C++ przez Nightmare43 Użytkownik (630 p.)
zamknięte 30 lipca 2016 przez Nightmare43
Witam

Jeśli zapis w pliku wygląda mniej więcej tak:
zmienna

zmienna2

zmienna3

itd.

to czy istnieje jakaś funkcja która pozwala na zmianę pozycji do zapisu/odczytu względem numeru linii ? Widziałem coś na zasadzie poruszania się względem numeru znaku w pliku jednak ciężko mi w głowie poukładać jak miałbym skakać w ten sposób po między liniami bo dane nie są jednakowej długości .
komentarz zamknięcia: Dostałem odpowiedź :3

2 odpowiedzi

+2 głosów
odpowiedź 30 lipca 2016 przez Sebastian Fojcik Nałogowiec (43,020 p.)

jak miałbym skakać w ten sposób po między liniami bo dane nie są jednakowej długości

I tym samym odpowiedziałeś sobie na pytanie jak to zrobić: nie da się.

Pierwsza zmienna jest pod znakiem 0, więc jest łatwo. A teraz pytanie o ile znaków przesunąć się w pliku, żeby dotrzeć na początek drugiej zmiennej? Nawet jeśli wiesz, albo to jakoś obliczysz, to to samo musiałbyś zrobić dla wszystkich linii w pliku. A nie daj Boże skrócisz jedną linijkę w dowolnym miejscu w pliku i cały program się sypie...

Nie ma nic złego w odczytywaniu pliku wierszami. Jeśli chcesz się dostać do 5 wiersza, to wczytaj 5 wierszy za każdym razem nadpisując wartość stringa:

ifstream plik("dane.txt");
string wiersz;
for( int i = 0; i < 5; i++ )
     getline( plik, wiersz );
cout << "5 wiersz to: " << wiersz;

To jest najprostsze rozwiązanie Twojego problemu. Jeśli uważasz je za zbyt wolne, bo za każdym razem trzeba alokować pamięć na nowego stringa (i pewnie piszesz program dla NASA), to możesz napisać pętlę, która będzie odczytywała znak po znaku i "wyłapywała" znaki końca linii. Jeśli minie 4 znaki '\n' to znaczy, że obecnie znajduje się w 5 wierszu. Coś takiego:

ifstream plik("dane.txt");

for( int i = 0; i < 4; )
{
     if( plik.get() == '\n' )
          i++;
}

string wiersz;
getline( plik, wiersz );
cout << "5 wiersz to: " << wiersz;

Pętla ta, tak jak napisałem, 4 razy minie znak nowej linii, więc za 4 razem będzie już na początku 5 wiersza.

Przy tym wszystkim należy jeszcze zadbać o sytuację, gdy nastąpi koniec pliku (np. chcesz odczytać 20 wiersz, a plik ma ich tylko 15).

Pozdrawiam.

komentarz 30 lipca 2016 przez Nightmare43 Użytkownik (630 p.)
Dziękuję za wyczerpującą odpowiedz!
0 głosów
odpowiedź 30 lipca 2016 przez Patrycjerz Mędrzec (192,320 p.)

Była masa tego typu pytań...

Nie ma takiej możliwości. Możesz np. przesuwać wskaźnik, licząc znaki nowej linii lub użyć pętli z funkcją getline.

komentarz 30 lipca 2016 przez Nightmare43 Użytkownik (630 p.)
edycja 30 lipca 2016 przez Nightmare43
Wiem że łatwo to zrobić z getline() ale myślałem że może przy takiej funkcji było by bardziej efektywnie no szkoda

Podobne pytania

0 głosów
0 odpowiedzi 302 wizyt
0 głosów
2 odpowiedzi 396 wizyt
+1 głos
1 odpowiedź 3,199 wizyt

92,568 zapytań

141,424 odpowiedzi

319,630 komentarzy

61,956 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!

...