fclose(fOut); // закрытие файла записи

}

В приведенном примере:

1.  Функция delBlanks получает имя файла, из которого надо прочитать исходную книгу и имя файла, в который надо записать результат

2.  Объявляются две строки: s1, в которую будут последовательно читаться строки исходной книги, и s2, в которую будет переписываться s1 с удаленными лишними пробелами.

3.  Объявляются два рабочих указателя на char: p1 и p2, с помощью которых будут удаляться лишние пробелы.

4.  Объявляются файловая переменная fIn, в которой открывается на чтение исходная книга и файловый поток fOut, в которой открывается результирующий файл.

5.  Далее в цикле while до тех пор пока во входном потоке есть строки:

a.  В s1 читается очередная строка.

b.  Выполняется удаление лишних пробелов с записью результата в s2.

c.  Строка s2 записывается в выходной файл.

6.  Выполняется закрытие файлов.

8.3.  Ввод/вывод строк в C++

8.3.1.  Понятие потока. Стандартные потоки

В С++ обмен данными с внешними устройствами выполняется с помощью потоков (stream). В программе на языке С++ поток представляется как внешняя по отношению к программе последовательность символов (char). Объявленный в программе поток может быть настроен:

·  на консоль и тогда он будет работать как поток вывода на консоль;

·  на клавиатуру и тогда он будет работать как поток ввода с клавиатуры;

·  на файл и тогда он будет работать как поток ввода из файла, вывода в файл или то и другое вместе.

НЕ нашли? Не то? Что вы ищете?

Потоки различаются по

·  направлению работы: входные (только чтение), выходные (только запись) и двунаправленные (чтение и запись);

·  преобразованию: форматируемые (текстовый), неформатируемые (бинарные);

·  типу: стандартный; строковый; файловый.

Стандартными в С++ называют потоки, имеющие фиксированное имя по умолчанию настроенные на работу с консолью и клавиатурой.

Для подключения стандартных потоков в тексте программы надо указать:

#include <iostream>

using namespace std;

Имена стандартных потоков:

·  cin — (тип istream), стандартный ввод (stdin); по умолчанию клавиатура;

·  cout — (тип ostream), стандартный вывод; по умолчанию экран;

·  clog, сеrr — (тип ostream), стандартный вывод для ошибок; по умолчанию экран

Стандартные потоки однонаправленные, форматируемые.

8.3.2.  Вывод в стандартный поток в С++

Вывод

Вывод в поток в С++ выполняется с помощью операции «<<».

Примеры.

cout << 10;

cout << "Hello!";

int a = 8;

cout << a;

double r = 1.1;

cout << 2 * 3.14 * r;

В приведенном примере на экран последовательно будет выведено:

10 Hello! 8 6,908

В одном выражении можно указывать несколько элементов для вывода:

int a = 9;

cout << "a = " << a << ", ей Богу!";

Здесь на экран будет выведено:

a = 9, ей Богу!

Несколько выражений вывода «копят» вывод в одну строку:

int a = 1, int b = 3;

cout << "a = " << a;

cout << ", b = " << b;

Здесь на экран будет выведено:

a = 1, b = 3

Для перехода на новую строку надо вывести endl – признак конца строки:

int a = 1, int b = 3;

cout << "a = " << a << endl;

cout << "b = " << b;

В этом случае на экран будет выведено:

a = 1

b = 3

Вывод строк

Вывод строк выполняется обычным образом:

char str[] = "Вороне где-то Бог послал кусочек сыру.";

cout << str << endl;

Здесь на экран будет выведено:

Вороне где-то Бог послал кусочек сыру.

8.3.3.  Ввод из стандартного потока в С++

Ввод

Ввод из потока в С++ выполняется с помощью операции «>>».

Примеры.

Ввод одного значения выглядит так:

int a;

cin >> a;

Здесь на клавиатуре надо набрать целое число, значение которого будет присвоено переменной a.

В одном выражении можно вводить сразу нескольких значений:

int a, b, c;

cout << "Введите значения a, b и c:";

cin >> a >> b >> c;

cout << "a = " << a << ", b = " << b << ", c = " << c;

Вводимые значения надо разделять пробелом. Результат выполнения приведенного фрагмента кода на экране будет выглядеть так:

Введите значения a, b и c: 8 9 12

a = 8, b = 9, c = 12

Еще пример:

#include <iostream>

#include <clocale> // подключение библиотеки использования кириллиц

using namespace std;

int main()

{

setlocale(LC_CTYPE, "Russian"); // использование кириллиц

double a, b, c;

cout << "a, b = ";

cin >> a >> b;

c = a + b;

cout << "a + b = " << c << endl;

cout << “Разность " << a << “ и ” << b;

cout << “ равна ” << a - b << endl;

return 0;

}

Результат выполнения кода примера на экране будет выглядеть так:

a, b = 9 4

a + b = 13

Разность 9 и 4 равна 5

Примечание.

Для использования кириллиц в выводимой в поток информации надо:

1.  Подключить специальную библиотеку:

#include <clocale> // подключение библиотеки использования

2.  В начале функции main вызвать функцию разрешающую использование кириллиц:

setlocale(LC_CTYPE, "Russian"); // использование кириллиц

Если этого не сделать, то в поток будут выводиться «зюковки».

Ввод строк

Ввод строк из стандартного потока имеет «печальную» особенность: набранная на клавиатуре строка вводится до первого пробела:

Пример:

char str[50];

cout << "Введите строку: ";

cin >> str;

cout << "Введена строка: " << str << endl;

Результат выполнения приведенного фрагмента кода на экране будет выглядеть так:

Введите строку: Вороне где-то Бог послал кусочек сыру

Введена строка: Вороне

Для преодоления этой ситуации у потока ввода есть метод getline, обращение к которому имеет вид:

cin. getline(str, len);

где:

str – строка, в которую надо ввести значение;

len – длина строки str.

Метод getline будет вводить набираемую на клавиатуре строку до ввода символа «конец строки» или до исчерпания длины строки.

Приведенный выше пример с использованием метода getline:

char str[101];

cout << "Введите строку: ";

cin. getline(str, 100);

cout << "Введена строка: " << str << endl;

даст правильный результат:

Введите строку: Вороне где-то Бог послал кусочек сыру

Введена строку: Вороне где-то Бог послал кусочек сыру

8.4.  Текстовые файлы в C++

8.4.1.  Вывод/ввод в текстовый файл

Вывод (запись) в текстовый файл

Для записи данных в текстовый файл в надо выполнить следующие действия

1.  Подключить библиотеку файловых потоков:

#include <fstream>

using namespace std;

2.  Объявить файловый поток (переменную) для записи:

ofstream os; // поток для записи

3.  Открыть файл (связать файловый поток с конкретным файлом):

os. open("D:\\TMP\\fname. txt"); // файл для записи

4.  Выполнить запись данных в поток текстового файла:

os << ...;

5.  Закрыть поток по завершению записи:

os. close();

Объявление файловой переменной можно совместить с открытием файла:

ofstream os("D:\\TMP\\fname. txt");

Ввод (чтение) из текстового файла

Для чтения данных из текстового файла в надо выполнить следующие действия:

1.  Подключить библиотеку файловых потоков:

#include <fstream>

using namespace std;

2.  Объявить файловый поток (переменную) для чтения:

ifstream is; // поток для записи

3.  Открыть файл (связать файловый поток с конкретным файлом:

is. open("D:\\TMP\\fname. txt"); // файл для записи

4.  Выполнить запись данных в поток текстового файла:

is >> ...;

5.  Закрыть поток по завершению записи:

is. close();

Также как в случае вывода объявление файловой переменной ввода можно совместить с открытием файла:

ifstream os("D:\\TMP\\fname. txt");

Полезные методы (функции) потоков чтения/записи

Потоки чтения/записи имеют следующие полезные методы:

1.  Чтения из потока строки:

char str[200];

is. getline(s1, 200);

Метод getline файлового потока ввода полностью аналогичен методу getline стандартного потока ввода.

2.  Контроль конца файла

bool is. eof();

Метод is. eof возвращает true, если файл потока is прочитан до конца и false в противном случае.

8.4.2.  Примеры

Пример 1. Запись и чтение числовых данных

#include <iostream>

#include <fstream>

#include <clocale>

using namespace std;

int main()

{

setlocale(LC_CTYPE, "Russian");

ofstream streamOut("D:\\TMP\\data. txt"); // открытие потока для записи

int a, b, c;

cout << "a, d, c = ";

cin >> a >> b >> c;

streamOut << a << " " << b << " " << c << endl;

int n;

cout << "Количество элементов массива = ";

cin >> n;

streamOut << n << endl;

double element;

cout << "Введите элементы массива: ";

for (int i = 0; i < n; ++i)

{

cout << i << ") ";

cin >> element;

streamOut << element << endl;

}

streamOut. close(); // закрытие потока

return 0;

}

В приведенном примере:

1.  Объявляется файловый поток вывода streamOut, в котором открывается файл D:\\TMP\\data. txt.

2.  Объявляются три переменные целого типа: a, b и c, значения которых вводятся с консоли и записываются в файл.

3.  Объявляется переменная n –количество элементов массива, значение которой вводится с консоли и также записывается в файл.

4.  Затем в цикле с консоли вводится очередной элемент массива и записывается в файл.

5.  В конце выполняется закрытие потока.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4