Usuwanie duplikatów słów następujących po sobie za pomocą strumieniowania plików do zmiennych string

0
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
fstream buff;
	fstream plik;
	plik.open("plik.txt", ios::in);
		fstream temp;
	temp.open("temp.txt", ios::app);
	if(!plik)
	{
		cout << "No nie";
		return 1;
	}else
	{
        string linia;
		string wszystko;
		string slowo="";

		string buf="";
bool istnienia=false;



		while(getline(plik, linia))
		{
buff.open("buff.txt", ios::in | ios::out | ios::trunc );

		buff<<linia;
		wszystko="";
		while(buff>>slowo)
		{
		cout<<"tuta"<<endl;
		cout<<slowo<<endl;
		if(buf!=slowo)
		wszystko = wszystko + " " + slowo;
		/*istnienia=true;
		if(istnienia==true)
		continue;
		wszystko = wszystko + " " + kolor;
		buf = kolor;*/

buf = slowo;

}
cout<<wszystko<<endl;
wszystko+="\n";
temp<<wszystko;

       buff.close();	}




		plik.close();
		temp.close();
	}



	return 0;
}

Witam,
Chciałbym aby ten program wczytywał dane z "plik" do "buff" linia po lini, potem usuwał powtórzenia (ale ale; tak tak) w "buff" i zapisywał do "temp".
W rezultacie plik ma być przekopiowany do temp bez bliskich powtórzeń.
Od godziny nie mogę się uporać z while'm i "buff>>slowo".
Będę wdzięczny za każdą radę :D

1
		ofstream temp("temp.txt", ios::trunc);
	
		while (getline(plik, linia)) 
		{
			istringstream iss(move(linia));

			string prev_s;

			while (iss >> slowo) 
			{
				if(prev_s != slowo)	
				{
					if(!prev_s.empty()) temp << ' ';
					temp << slowo;
				}

				prev_s = slowo;
			}

			temp << '\n';
		}

Wersja mniej naiwna, uwzględniająca spacje i znaki interpunkcyjne:

while (getline(plik, linia)) 
{
	auto i1 = linia.begin();
	auto i2 = linia.end();
	auto prev_i1 = i2;
	auto prev_i2 = i2;

	while(i1 != i2)
	{
		auto f_i1 = find_if(i1, i2, [](char c) { return isalpha(c); });
		auto f_i2 = find_if(f_i1, i2, [](char c) { return !isalpha(c); });
			
		if(!std::equal(f_i1, f_i2, prev_i1, prev_i2))
		{
			std::copy(i1, f_i1, std::ostream_iterator<char>(temp));
			std::copy(f_i1, f_i2, std::ostream_iterator<char>(temp));
		}
		else 
		{
			while(i1 != f_i1 && isspace(*i1)) ++i1;
			std::copy(i1, f_i1, std::ostream_iterator<char>(temp));
		}

		prev_i1 = f_i1;
		prev_i2 = i1 = f_i2;
	}
	temp << '\n';
}

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