Nie rozumiem kodu - proszę o wyjaśnienie

0

Witam, obecnie dysponuję pewnym kodem źródłowym, który będzie w waszej opinii zapewne błędny. Zgodzę się z wami w tej kwestii z tym, że tworzę ten temat jedynie w celu znalezienia odpowiedzi typu "Dlaczego tak jest?".

Kod C++:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main()
{
    ifstream plik("./plik.txt");

    if(plik)
    {
        plik.seekg(10, ios::beg);
         // Udało się otworzyć plik, a więc można rozpocząć odczytywanie

        string linia;     // Zmienna do przechowywania odczytanych wierszy tekstu

        while(getline(plik, linia))    // Jeśli jeszcze nie nastąpił koniec pliku, czytamy dalej
        {

            cout << linia << endl; // Wyświetlamy odczytany tekst w konsoli
                                   // Można też zrobić z nim coś innego
        }
    int pozycja = plik.tellg(); // Sprawdzamy pozycję

    cout << "Jesteśmy na znaku nr " << pozycja << " w pliku." << endl;
    }
    else
    {
        cout << "BŁĄD: nie można otworzyć pliku do odczytu." << endl;
    }

    return 0;
}

 

O to moje notatki:

  1. Instrukcja przesuwa kursor na 10 literę (numeracja od 0).
  2. Rezerwacja pamięci w komputerze dla łańcucha znaków.
  3. Rozpoczęcie wykonywania pętli, która:
  1. odczytywuje zdanie z pliku.
  2. zapisuje je w pamięci
  3. wyświetla na ekranie.
    i wykonuje te cykle do końca tekstu zapisanego w pliku.
  1. Rezerwacja pamięci w komputerze, której zawartością jest bieżąca lokalizacja kursora wskazującego n-tą literę. (W programie to -1, dlaczego?)
  2. Wyświetlenie tej lokalizacji w konsoli.

I pytanie brzmi:
Dlaczego wskazywana jest pozycja (litera) równa -1? Czy to za sprawą pętli? Czy to przez nią kursor jest "wyrzucany" poza obszar jej działań? Ponieważ numeracja w komputerach zaczyna się od 0, więc rozumiem, że -1 to wskazywana litera przed literą o pozycji 0 od której zaczyna się pętla.

Wybaczcie, jeżeli moje myśli są niezbyt ładnie i poprawnie "ubrane" w słowa i jeśli już taki temat istniał. Bardzo ciekawi mnie to, czy są jakieś sposoby działania, o których nie wiem i które powodują u mnie zamieszanie?

2

http://en.cppreference.com/w/cpp/io/basic_istream/tellg

Return value
The current position of the get pointer on success, pos_type(-1) on failure

Wychodzisz z pętli dopiero jak nie dało się niczego odczytać, a wtedy strumień jest w stanie błędu i funkcja tellg() z definicji zwraca -1.

0

Dzięki za odpowiedź. :) Przynajmniej wiem coś konkretnego na przyszłość. Poszukam bardziej konkretnych poradników, artykułów, itd.

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