• 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

VPS Starter Arubacloud
+1 głos
1,714 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,340 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 289 wizyt
0 głosów
2 odpowiedzi 382 wizyt
+1 głos
1 odpowiedź 3,170 wizyt

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...