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

Problem z odczytaniem 3 ostatnich linijek pliku txt w C++

Aruba Cloud - Virtual Private Server VPS
0 głosów
466 wizyt
pytanie zadane 20 lutego 2022 w C i C++ przez DardhanPL Nowicjusz (200 p.)

Witam,

Chciałbym prosić o naprowadzenie w rozwiązaniu mojego probemu. Programuje aplikacje puzzle i chciałbym dodać zakładkę z ostatnimi graczami.

Mam zapis do pliku wykonany :

					fstream plik1;
						
					plik1.open( "ostatni gracz.txt", ios::app );
					if(plik1.good())
						{
							
							plik1 << this->game->GetGracz() ;
						
							plik1.close();
						}
					
					

					fstream plik2;
					
					
					plik2.open( "score gracz.txt", ios::app );
					if(plik2.good())
						{
							plik2 <<"\n";
							plik2 <<this->game->Kroki();
							

							plik2.close();
						}

I chciałbym odczytywać ostatnie 3 linijki kodu ,w tej chwili odczytuje pierwszą tylko czy mógłby mnie ktoś naprowadzić jak to wykonać?

Mój odczyt wygląda tak:

	private: System::Void Board_Load(System::Object^  sender, System::EventArgs^  e) {
			fstream plik1;
			string nazwa;
						
			plik1.open( "ostatni gracz.txt", ios::in );
			if(plik1.good())
			{

				getline(plik1, nazwa);
				plik1.close();
			}
			this->label1->Text = msclr::interop::marshal_as<String ^>(nazwa);


			fstream plik2;
			
			
			string kroki1;			
			plik2.open("score gracz.txt", ios::in );
			
			if(plik2.good())
			{
				
				getline(plik2, kroki1);
				plik2.close();
			}
			this->label2->Text = msclr::interop::marshal_as<String ^>(kroki1); 

			 
			 }

Z góry dziękuje za pomoc,

Pozdrawiam

komentarz 20 lutego 2022 przez tkz Nałogowiec (42,020 p.)

https://stackoverflow.com/questions/11876290/c-fastest-way-to-read-only-last-line-of-text-file

#include <iostream>
#include <fstream>
#include <sstream>

using namespace std;

int main()
{
    string filename = "test.txt";
    ifstream fin;
    fin.open(filename);
    if(fin.is_open()) {
        fin.seekg(-1,ios_base::end);                // go to one spot before the EOF

        bool keepLooping = true;
        while(keepLooping) {
            char ch;
            fin.get(ch);                            // Get current byte's data

            if((int)fin.tellg() <= 1) {             // If the data was at or before the 0th byte
                fin.seekg(0);                       // The first line is the last line
                keepLooping = false;                // So stop there
            }
            else if(ch == '\n') {                   // If the data was a newline
                keepLooping = false;                // Stop at the current position.
            }
            else {                                  // If the data was neither a newline nor at the 0 byte
                fin.seekg(-2,ios_base::cur);        // Move to the front of that data, then to the front of the data before it
            }
        }

        string lastLine;            
        getline(fin,lastLine);                      // Read the current line
        cout << "Result: " << lastLine << '\n';     // Display it

        fin.close();
    }

    return 0;
}

 

komentarz 20 lutego 2022 przez DardhanPL Nowicjusz (200 p.)

Dziekuję bardzo za pomoc

Rozwiązałem problem troche inaczej ,ale ten jak najbardziej działą bo też sprawdziłem:

				fstream plik1;
				string nazwa_gracza;


				stack <string> board_nazwa;  // Inicjalizacja stosu LIFO nazw graczy
						
				plik1.open( "ostatni gracz.txt", ios::in );
				if(plik1.good())
				{
					while(!plik1.eof())		//Petla przepisująca do stosu aż dojdzie do konca pliku
					{
						
						getline(plik1, nazwa_gracza);	//odczyt pojedyńczej nazwy
						board_nazwa.push(nazwa_gracza); //Położenie na wierzchołek stosu ostatnio oczytanej nazwy

					}
					
					
					
					plik1.close();	//Zamkniecie pliku

				}
				board_nazwa.pop();	//Pominiecie znaku konczącego plik z nazwami gracza(Usuwanie z wierzchołka stosu)
				nazwa_gracza=board_nazwa.top();	//Przypisanie do nazwy gracza wartość wierzchołka stosu
				board_nazwa.pop();	//Skrócenie stosu o jeden element z wierzchołka

				this->label1->Text = msclr::interop::marshal_as<String ^>(nazwa_gracza);

				nazwa_gracza=board_nazwa.top();
				board_nazwa.pop();

				this->label3->Text = msclr::interop::marshal_as<String ^>(nazwa_gracza);

				nazwa_gracza=board_nazwa.top();
				board_nazwa.pop();

				this->label5->Text = msclr::interop::marshal_as<String ^>(nazwa_gracza);

				nazwa_gracza=board_nazwa.top();
				board_nazwa.pop();

				this->label7->Text = msclr::interop::marshal_as<String ^>(nazwa_gracza);




				fstream plik2;
				string ilosc_krokow;	
				stack <string> board_kroki;  // Inicjalizacja stosu LIFO ilosci krokow
				plik2.open("score gracz.txt", ios::in );
			
				if(plik2.good())
				{
				
					while(!plik2.eof())		//Petla przepisująca do stosu aż dojdzie do konca pliku
					{
						
						getline(plik2, ilosc_krokow);	//odczyt pojedyńczej ilosci korkow
						board_kroki.push(ilosc_krokow); //Położenie na wierzchołek stosu ostatnio oczytanej ilosci korkow

					}

					plik1.close();	//Zamkniecie pliku
				}
				
				board_kroki.pop();	
				ilosc_krokow=board_kroki.top();	//Przypisanie do ilosci korkow wartość wierzchołka stosu
				board_kroki.pop();

				this->label2->Text = msclr::interop::marshal_as<String ^>(ilosc_krokow);

				ilosc_krokow=board_kroki.top();
				board_kroki.pop();

				this->label4->Text = msclr::interop::marshal_as<String ^>(ilosc_krokow);

				ilosc_krokow=board_kroki.top();
				board_kroki.pop();

				this->label6->Text = msclr::interop::marshal_as<String ^>(ilosc_krokow);

				ilosc_krokow=board_kroki.top();
				board_kroki.pop();

				this->label8->Text = msclr::interop::marshal_as<String ^>(ilosc_krokow);
			 

 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 329 wizyt
pytanie zadane 13 lutego 2020 w C i C++ przez Damianek Obywatel (1,020 p.)
0 głosów
0 odpowiedzi 238 wizyt
0 głosów
0 odpowiedzi 230 wizyt

93,264 zapytań

142,260 odpowiedzi

322,234 komentarzy

62,582 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...