Назад | Начало урока | Вперед
Содержание

Глава 02 (продолжение 1)

Вверх

Программа ставит пропущенные пробелы после запятых и других знаков препинания
Задача: Нередко бывает так, что при печати текста бывают пропущены пробелы после знаков препинания. Не беда! Программа добавит пропущенные пробелы.

Программа 02_03


// Example_02_03 Ставит пробелы после знаков препинания
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

void textWrap(istream& in, ostream& out) {

char cur = 'a';
char last = 'a';
string str =".,:;!?";
int n = -1;
int k = -1;

while (in.get(cur)) {

if ('"' == cur )
k = (-k);

n = str.find_first_of(last);

if ('"' == cur && n >= 0 ) {

out.put(cur); //или out << cur;
last = cur;
continue;
}

if ( '"' == last && !isspace(cur) && k==1) {

out.put(cur); //или out << cur;
last = cur;
continue;
}

if ( '"' == last && !isspace(cur)) {

out << " ";
out.put(cur); //или out << cur;
last = cur;
continue;
}

if (!isspace(cur) && n >= 0)
out << " ";

out.put(cur); //или out << cur;
last = cur;

}
}

int main() {

ifstream in("fileFrom.txt");
ofstream out("fileTo.txt");

if (!in || !out) {

return(EXIT_FAILURE);
}

textWrap(in, out);

out.close();
in.close();

if (out) {

return(EXIT_SUCCESS);
}
else {
return(EXIT_FAILURE);
}

return 0;

}


Результат:

Анализ:

Основную работу в этой программе выполняет функция textWrap(). В параметры этой функции передается ссылка на поток in, открытый для чтения, и ссылка на поток out, открытый для записи.

void textWrap(istream& in, ostream& out) {

char cur = 'a';
char last = 'a';
string str =".,:;!?";
int n = -1;
int k = -1;

В цикле while при помощи функции чтения из потока get() программа считывает посимвольно из потока.

while (in.get(cur)) {

Получив при вызове функции символ, мы может его проверить на ряд условий. Если полученный символ является кавычкой, то инвертируем сигнальную переменную k. Это будет означать, что кавычка открывающая.

if ('"' == cur )
k = (-k);

Найдем позицию в строке str, которую занимает считанный символ last и сохраним это значение в n.

n = str.find_first_of(last);

Дело в том, что если считанный символ last не является одним из знаков препинания, то он и не может содержаться в строке str, которая состоит только из знаков препинания. Если символ last не содержится в строке str, то функция find_first_of() возвращает -1. Следовательно если n>=1, то символ last является знаком препинания.

Если текущий символ является кавычкой, и его положение в строке является положительным числом, то копируем этот символ в выходной поток и одновременно инициализируем переменную last значением-кавычкой. Вернемся к началу цикла, чтобы прочитать следующий символ из потока.

if ('"' == cur && n >= 0 ) {

out.put(cur); //или out << cur;
last = cur;
continue;
}

Если следующий полученный символ не является пробелом, переменная last хранит в себе кавычку, и сигнальная переменная сигнализирует что предыдущий символ был открывающей кавычкой, то пробел после символа ставить не надо. Копируем полученный символ в выходной поток, а в переменную last записываем считанный символ. Вернемся на начало цикла для чтения следующего символа.

if ( '"' == last && !isspace(cur) && k==1) {

out.put(cur); //или out << cur;
last = cur;
continue;
}

Если переменная last содержит в себе кавычку, и следующий за ней символ не является пробелом, то перед тем как в выходной поток вывести очередной символ, надо вывести в него символ пробела. После того как символ пробела и за ним сам рассматриваемый текущий символ выведены в выходной поток, присвоим переменной last текущий символ и вернемся к началу цикла, чтобы считать очередной символ из входного потока.

if ( '"' == last && !isspace(cur)) {

out << " ";
out.put(cur); //или out << cur;
last = cur;
continue;
}

И наконец, если полученный текущий символ не пробельный, и кроме того, переменная n имеет положительное значение (что говорит о том, что предыдущий полученный символ являлся знаком препинания), необходимо перед очередным символом, который следует за знаком препинания вставить пробел. Затем копируем в выходной поток текущий символ и записываем в last очередное символьное значение.

if (!isspace(cur) && n >= 0)
out << " ";

out.put(cur); //или out << cur;
last = cur;

}
}

Назад | Начало урока | Вперед
Содержание

Hosted by uCoz