• 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++

Object Storage Arubacloud
0 głosów
298 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,000 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ź 285 wizyt
pytanie zadane 13 lutego 2020 w C i C++ przez Damianek Obywatel (1,020 p.)
0 głosów
0 odpowiedzi 136 wizyt
0 głosów
0 odpowiedzi 156 wizyt

92,524 zapytań

141,357 odpowiedzi

319,382 komentarzy

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

...