Maksymalna ilość znaków w strumieniu

0

Cześć, próbuję sobie robić zadania z książki Thinking in C++, jednak utknąłem na podstawach strumieni.
Czy ktoś może mnie naprowadzić na rozwiązanie?

Zadanie brzmi:

Wiemy, że setw() umożliwia wczytanie minimalnej liczby znaków, ale co, jeśli chcemy odczytać liczbę maksymalną? Napisz efektor, który umożliwi użytkownikowi wskazać maksymalną liczbę znaków do odczytania. Niech efektor ten działa także w przypadku strumieni wyjściowych, skracając w miarę potrzeb pola tak, aby nie wykraczały poza wyznaczoną długość.

Wiem, że muszę stworzyć klasę z konstruktorem, który przyjmie w parametrze ilość znaków. Dodatkowo ta klasa musi przeciążać operatory << i >>.
Niestety niczego więcej nie udało mi się osiągnąć. Jakieś wskazówki?

1

Czyli nie zrozumiałeś co robi setw :/

0

Wydaje mi się, że rozumiem, co robi setw. Niemniej jednak w żaden sposób mi to nie pomaga. Próbowałem kombinować z ustawieniem width, ale niczego to nie dało.

1

Racja, wydaje Ci się. Na początek zobacz czym jest setw.

0

setw to efektor (manipulator z parametrem), który robi to samo, co metoda strumienia: width. Efekty tych linijek będą identyczne:

 
//Przypadek 1 z użyciem metody
cout.width(5);
cout << "Cze";

//Przypadek 2 z użyciem efektora
cout << setw(5) << "Cze";

Co jeszcze skrywa w sobie ten setw?

0

Serio nikt nie potrafi mi pomóc? Więc ponownie proszę o przeniesienie tematu na forum C++.

0

Może przeczytaj ten rozdział raz jeszcze, tylko uważnie.

0

No czytałem już 2 razy i nadal nie wiem, czego nie łapię. Czytam też w necie, ale nadal nic.

5

Gdybyś kliknął F2, F4 czy co odpowiada w Twoim IDE za "idź do definicji" to byś zobaczył, że std::setw jest funkcją. Gdybyś sprawdził to w dokumentacji: http://en.cppreference.com/w/cpp/io/manip/setw - zobaczyłbyś to samo. Tyle.

Masz tu przykładową implementację dla limitowanego wyjścia - ilość znaków ustawiłem jako stałą kompilacji, żebyś też mógł coś sam zrobić.
http://melpon.org/wandbox/permlink/GfsUWUMrIQB7JuqF

0

Nie, no nie ogarniam tego w żaden sposób.
W książce mi piszą, że muszę stworzyć klasę, która przeciąża operator <<.
Ten rozdział jest jeszcze przed template'ami, więc to musi być proste. Kombinuje na wszystkie możliwe sposoby i dochodzę do wniosku, że coś jest nie tak, ale nie wiem co.

 
class setmax
{
public:
	setmax(int i): m_i(i)
	{

	}

	friend ostream & operator << (ostream & s, const setmax & effector);
private:
	int m_i;
};

ostream & operator << (ostream & os, const setmax & effector)
{
//dla testow, czemu string jest pusty po tej operacji?
	stringstream ss;
	ss << os.rdbuf();
	string str = ss.str();

	return os;
}



int _tmain(int argc, _TCHAR* argv[])
{	
	cout << setmax(5) << "Maksimum 5 znakow";

	getchar();
	return 0;
}

Mój problem polega na tym, że nie wiem, co zrobić w tym operatorze.
Pytanie na początek - czemu string jest pusty po tej operacji?
Jeśli zamiast

 
ss << os.rdbuf();

dam

 
ss.copyfmt(os);

to string też jest pusty.

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