Justowanie tekstu

0

Jestem w trakcie kodowania programu, który ma wyrównywać wprowadzony doń tekst, tudzież wczytany z pliku do 120 znaków w linii.
Jeśli 120 znak to środek słowa, całe słowo leci do nowej linii i tak do końca. Potem brakująca ilość znaków ma być uzupełniana spacjami do 120 w każdej linii.

Aktualnie problemem jest dla mnie dzielenie tego tekstu na kolejne wiersze, większość trzyma się kupy, jest mniej niż 120, ale czasami znajduje się jakiś szalony, który ma kilka znaków więcej.
Od kilku godzin próbuję znaleźć błąd, lecz nie za bardzo mi to wychodzi. Daję cały kod, funkcja w której jest problem to justowanie dopomóżcie :)

#include <iostream>
#include <cstdlib>
#include <string>
#include <fstream>

using namespace std;

void justowanie(string tekst)
{
	string justed;
	int miejscespacji=0, x=1, y=0;
	cout << tekst;
	
	for(int i=0; i<tekst.length();i++)
	{
		
		if(x!=120 || i==0)
			justed+=tekst[i];
		if(x==120)
		{
			if(tekst[i]==' ')
			{
			justed+="\n";
			}
			else
			{
				justed.insert(miejscespacji,"\n");
				justed.erase(miejscespacji+1,1);
			}	
		x=1;
		justed+=tekst[i];
		}	
		
		if(justed[i]==' ')
			miejscespacji=i;
		
		if(justed[justed.length()-1]==' ' && justed[justed.length()-2]=='\n')
		{
			justed.erase(justed.length()-1, 1);
		}
		x++;
	}


	
	ofstream zapis;
	zapis.open("wyjustowany.txt");
	zapis << justed;
	zapis.close();
	}



bool start()
{
	int choose;
	cout <<"Program justuje tekst z pliku (.txt) o podanej nazwie, lub wczytany z klawiatury\n";
	system("pause"); system("cls");
	cout <<"Wczytac tekst z pliku, czy zostanie podany ?\n1.Z pliku.\n2.Podany.\nTwoj wybor: ";
	do{
	cin >> choose;
		if(!cin || choose!=1 && choose!=2)	
		{
			cout <<"\nPodaj poprawna liczbe: ";
			cin.clear();
			cin.sync();
		}
	}while(!cin || choose!=1 && choose!=2);
	system("pause"); system("cls");
	
	if(choose==1)
		return 1;
	else
		return 0;
}

void zpliku ()
{
	int choose;
	ifstream plik;
	string nazwapliku,tekst;
	
	do{
		cout <<"Podaj nazwe pliku (bez rozszerzenia), z ktorego wczytac tekst: ";
		cin >> nazwapliku;
		nazwapliku+=".txt";
		plik.open(nazwapliku.c_str());
		if(plik.is_open())
		{
			while(plik.good())
				{
					getline(plik, tekst);
				}
			justowanie(tekst);
			choose=2;
		}
		else
		{
			cout <<"Problem z odczytem pliku. \nBrak pliku o takiej nazwie, lub plik nie jest plikiem .txt";
			cout <<"\n\n1.Podaj nazwe ponownie.\n2.Wyjdz.\n\nWybor: ";
			do{
			cin >> choose;
				if(!cin || choose!=1 && choose!=2)	
				{
					cout <<"\nPodaj poprawna liczbe: ";
					cin.clear();
					cin.sync();
				}
			}while(!cin || choose!=1 && choose!=2);
		}
		system("pause"); system("cls");
	}while(!cin || choose==1 );
	
}

void stdstr()
{	
	string tekst;
	cout <<"Podaj tekst, ktory ma zostac wyjustowany: ";
	cin.clear();
	cin.sync();
	getline(cin, tekst);
	justowanie(tekst);
}



main()
{
	if(start())
		zpliku();
	else
		stdstr();
	
	return 0;
}

Tutaj dorzucam link do zdjęcia jak to u mnie po justowaniu wygląda. 2 najdłuższe linijki są za długie.
http://i.imgur.com/TqWAALt.jpg

0
            else
            {
                justed.insert(miejscespacji,"\n");
                justed.erase(miejscespacji+1,1);
            }    

tutaj jak napotkasz jakąś literkę to machnij fora który iteruje od tego miejsca do tyłu aż nie napotka spacji i podmieniaj wszystko na spację;
potem już tylko na końcu "justed" dodajesz \n

edit:
ee chyba przekombinowałem
a spróbuj podmienić
justed.erase(miejscespacji+1,1);
na
justed.erase(miejscespacji+1, i - miejscespacji);

0
gośćabc napisał(a):
            else
            {
                justed.insert(miejscespacji,"\n");
                justed.erase(miejscespacji+1,1);
            }    

tutaj jak napotkasz jakąś literkę to machnij fora który iteruje od tego miejsca do tyłu aż nie napotka spacji i podmieniaj wszystko na spację;
potem już tylko na końcu "justed" dodajesz \n

edit:
ee chyba przekombinowałem
a spróbuj podmienić
justed.erase(miejscespacji+1,1);
na
justed.erase(miejscespacji+1, i - miejscespacji);

Niestety nic to nie daje.

0

pewnie znajdą się corner case'y, które mogą to wysypać, ale nie powinno się to zdarzyć

#include <iostream>

using namespace std;

int main()
{
	string tekst = "Cze co tam u Ciebie ziomek, jak leci w super miescie Szczecinie bo ja jestem ze wsi.";
	string justed;
	int miejscespacji=0, x=0;
	size_t textSize = tekst.length();
	cout << tekst << std::endl << std::endl;

	for(unsigned i = 0; i < textSize ;i++)
	{
		if(x < 10) {
			justed += tekst[i];

			if(justed[i] == ' ') {
				miejscespacji = i;
			}

			++x;
		} else {
			if(tekst[i] == ' ') {
				justed += '\n';
				x = 0;
			} else {
				if(((i + 1) < textSize) && tekst[i + 1] != ' ') {
					justed.replace(miejscespacji, 1, "\n");
				}

				justed += tekst[i];
				auto pos = justed.find_last_of(' ');
				if(pos != std::string::npos) {
					if(justed.size() - pos < 10) {
						miejscespacji = pos;
					}
				}
				x = justed.size() - justed.find_last_of('\n');
			}
		}
	}

	std::cout << justed;

	return 0;
}

http://melpon.org/wandbox/permlink/BdnYiuMSenT18rfG

edit:

możesz też spróbować innego podejścia.
Wpakować wyrazy do vector'a i budować output string na podstawie tych wyrazów (dużo prostsze podejście imo).

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