[C++] Usuwanie znaku końca lini w pliku

Modyfikuję dane w pliku .txt. Najprostszy sposób jaki mi przyszedł do głowy to strumieniowe czytanie danych i zapisywanie do drugiego pliku (po drodze wstawiam gdzieniegdzie zmodyfikowane dane).Po pierwszym przetworzeniu pojawia się znak pustej linii. Po drugim pojawiają się dane śmieci (pętla wykonuje się raz za dużo,while(!eof())). Ustawiam kursor zapisu w odpowiednim miejscu, jednak gdy próbuję go nadpisać znakiem “”, nie dzieje się nic, a NULL daje w wyniku 0. Macie jakieś pomysły jak się pozbyć tego znaku końca lini ?

Komplikator VisualStudio 2008, Windows 7 Proffesional (ale w tym przypadku to chyba nie ma znaczenia :))

Algorytm zapisu

void bankomat::zapiszDane(int indeks)

{

	fstream wejście;

	fstream wyjście;

	wejście.open("Dane.txt",ios::in);

	wyjście.open("Dane.txt.tmp",ios::out|ios::trunc);

	int licznik=0;

	string tmp; 

	while (!wejście.eof())

	{

		if (licznik==indeks)

		{

			wejścietmp; 

			wejścietmp;

			wejścietmp;

			wejścietmp;

			wyjścielogin
			wyjściehasło
			wyjściesaldo
			wyjściehistoria
			licznik++;

		}

		else

		{

			wejścietmp;

			wyjście
			wejścietmp;

			wyjście
			wejścietmp;

			wyjście
			wejścietmp;

			wyjście
			licznik++;

		}

	}

	wyjście.seekp(-2,ios_base::end);

	wyjście
	wejście.close();

	wyjście.close();

}

Plik do obróbki

BillGates

okno

000000

BillGates.txt

Osama

boom

9000

Osama.txt

Przyklad

haslo

150

Przyklad.txt

Plik przerobiony 2 razy

BillGates

okno

999999

BillGates.txt

Osama

boom

9000

Osama.txt

Przyklad

haslo

150

Przyklad.txt

Przyklad.txt

Przyklad.txt

Przyklad.txt

Przyklad.txt

Nie ma gwarancji, że w pliku znajduje się znak EOF, z tego powodu nie można na tym opierać warunku pętli.

\n się pojawia, bo go po prostu zapisujesz na końcu…

NULL to faktycznie 0, więc i znak \0, jednak nie powinieneś stosować takiego zapisu.

Eee, pierwsze słyszę coś takiego…

Co do znaku nowej linii, to pojawia się tam, bo go wpisujesz za pomocą endl. Być może w kolejnym przebiegu to właśnie powoduje problem - w pliku zostaje pojedynczy znak nowej linii i cała pętla wykonuje się raz jeszcze. (ale zgaduję, nie kompilował i nie sprawdzałem)

@nr47 Masz rację (tak samo to opisałem, ale trochę bardziej zawile), ale w tym miejscu jest niezbędny ten endl(inaczej otrzymałbym np “BillGates.txtOsama”). Czytając wasze wypowiedzi olśnienie dostałem ^^.

if (!wejście.eof()) wyjście<

Tak na marginesie, wydajniej używać ‘\n’, bo endl za każdym razem wykonuje flush.

Dzięki, tego nie wiedziałem

Problem polega na tym że

wejście.eof()

będzie prawdą dopiero po nieudanym wczytaniu kolejnego wiersza.

void bankomat::zapiszDane(int indeks)

{

   fstream wejscie("Dane.txt",ios::in);

   fstream wyjscie("Dane.txt.tmp",ios::out|ios::trunc);

   int licznik=0;

   string login,haslo,saldo,historia;

   bool first=true;

   while(wejscie>>login>>haslo>>saldo>>historia)

   {

      if(first) first=false;

      else wyjscie<
      if(licznik++==indeks)

      {

         login=this->login;

         haslo=this->hasło;

         saldo=this->saldo;

         historia=this->historia;

      }

    wyjscie<
   }

   wejscie.close();

   wyjscie.close();

}

Może warto zapisywać jeden rekord w jednym wierszu, zamiast:

wyjscie<

użyj:

wyjscie<

oraz dodaj:

ostream &tb(ostream &s) { return s<<’\t’; }