Глава 02 (продолжение 1)
Вверх
Программа 02_03
using namespace std;
void textWrap(istream& in, ostream& out) {
char cur = 'a';
while (in.get(cur)) {
if ('"' == cur )
n = str.find_first_of(last);
if ('"' == cur && n >= 0 )
{
if ( '"' == last && !isspace(cur) && k==1)
{
if ( '"' == last && !isspace(cur))
{
if (!isspace(cur) && n >= 0)
out.put(cur); //или out << cur;
int main()
{
if (!in || !out)
{
textWrap(in, out);
out.close();
if (out)
{
return 0;
Анализ:
Основную работу в этой программе выполняет функция textWrap().
В параметры этой функции передается ссылка на поток in, открытый для чтения,
и ссылка на поток out, открытый для записи.
void textWrap(istream& in, ostream& out) {
char cur = 'a';
В цикле while при помощи функции чтения из потока get() программа считывает посимвольно из потока.
while (in.get(cur)) {
Получив при вызове функции символ, мы может его проверить на ряд условий.
Если полученный символ является кавычкой, то инвертируем сигнальную переменную k.
Это будет означать, что кавычка открывающая.
if ('"' == cur )
Найдем позицию в строке str, которую занимает считанный символ last и сохраним это значение в n.
Дело в том, что если считанный символ last не является одним из знаков препинания, то он и не может содержаться в строке str, которая состоит только из знаков препинания. Если символ last не содержится в строке str, то функция find_first_of() возвращает -1. Следовательно
если n>=1, то символ last является знаком препинания.
Если текущий символ является кавычкой, и его положение в строке является положительным числом, то копируем этот символ в выходной поток и одновременно инициализируем переменную
last значением-кавычкой. Вернемся к началу цикла, чтобы прочитать следующий символ из потока.
if ('"' == cur && n >= 0 )
{
Если следующий полученный символ не является пробелом, переменная last хранит в себе кавычку, и сигнальная переменная сигнализирует что предыдущий символ был открывающей кавычкой, то пробел после символа ставить не надо. Копируем полученный символ в выходной поток, а в переменную last записываем считанный символ. Вернемся на начало цикла для чтения следующего символа.
if ( '"' == last && !isspace(cur) && k==1)
{
if ( '"' == last && !isspace(cur))
{
И наконец, если полученный текущий символ не пробельный, и кроме того, переменная n имеет положительное значение (что говорит о том, что предыдущий полученный символ являлся знаком препинания), необходимо перед очередным символом, который следует за знаком препинания вставить пробел. Затем копируем в выходной поток текущий символ и записываем в last очередное символьное значение.
if (!isspace(cur) && n >= 0)
out.put(cur); //или out << cur;
Программа ставит пропущенные пробелы
после запятых и других знаков препинания
Задача: Нередко бывает так, что при печати текста бывают пропущены пробелы после знаков
препинания. Не беда! Программа добавит пропущенные пробелы.
// Example_02_03 Ставит пробелы после знаков препинания
#include <iostream>
#include <fstream>
#include <string>
char last = 'a';
string str =".,:;!?";
int n = -1;
int k = -1;
k = (-k);
last = cur;
continue;
last = cur;
continue;
out.put(cur); //или out << cur;
last = cur;
continue;
out << " ";
last = cur;
ofstream out("fileTo.txt");
in.close();
else
{
Результат:
char last = 'a';
string str =".,:;!?";
int n = -1;
int k = -1;
k = (-k);
n = str.find_first_of(last);
last = cur;
continue;
Если переменная last содержит в себе кавычку, и следующий за ней символ не является пробелом, то перед тем как в выходной поток вывести очередной символ, надо вывести в него символ пробела. После того как символ пробела и за ним сам рассматриваемый текущий символ выведены в выходной поток, присвоим переменной last текущий символ и вернемся к началу цикла, чтобы считать очередной символ из входного потока.
last = cur;
continue;
out.put(cur); //или out << cur;
last = cur;
continue;
out << " ";
last = cur;