Функция ofstream& operator<<(ofstream& ost, Document& d) это переопределение оператора вывода "<<" для типа Document.
А что она делает на самом деле?
while (ost<<ch) ost.put(ch) - означает, выводить символы, пока они есть в наличии;
Нет, это означает — попытаться вывести символ
ch в поток
ost и если получилось, то снова вывести его в поток, затем вернуться в начало цикла. Думаю это не то, что вы хотели.
"ost<<ch" - это запись логического выражения, которое истинно, пока есть в потоке символы
Это вставка символа
ch в поток
ost, кроме того это выражение возвращает состояние поток
ost, которое равно
true если операция вставки выполнима.
ost.put(ch) - это операция добавления символов в поток стандартный вывода
Фактически это синоним
ost<<ch (ну почти синоним), так что вы дважды вставляете один символ в поток.
А чтобы ваша функция работала так как вы хотите её можно, например, определить так:
ostream& operator<<(ostream& ost, Document& d){
for(list<Line>::iterator p = d.line.begin(); p != d.line.end(); p++)
for(Line::iterator q = p->begin(); q != p->end(); q++)
ost.put(*q);
return ost;
}
В функции istream& operator>>(istream& cin, Document& d) выход происходит, когда в потоке ввода заканчиваются символы.
Поток ввода
cin получает значение
false при вводе специального символа
Ctrl+Z в новой строке (либо нажатии функциональной клавиши
F6), ибо в потоке
cin символы сами по себе никогда не заканчиваются.
Цикл while (cin!=0) {ost<<d<<endl<<"proba";} был введен в программу Страуструпом и модифицирован мной в целях поиска ошибки, - когда была обнаружена проблема - незапись данных в файл и был попыткой проверить, выводится ли в файл хоть что то, в данном случае - слово "proba". Он не сработал и это даёт некоторую подсказку, вероятно, почему то как раз cin=0 и никогда не становилось ненулевым
Видимо вы очень вольно модифицировали код Струструпа. Это очень грубая ошибка. Лучше напишите так, например:
int main(){
ofstream ost("Dokument.txt", ios::app);
if(!ost) cerr << "File error\n";
else{
Document d;
cin >> d;
ost << d << endl;
}
}