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 |


