- •Алгоритмитизация и программирование Лекция 1
- •Общие сведения
- •Модель osi. Понятие об интерфейсах и протоколах. Рекомендация itu-t X.200
- •1.3. Системы счисления
- •Лекция 2
- •2.1. Способы описания алгоритмов функционирования узла коммутации
- •2.2. Описание алгоритмов с помощью диаграммы состояний
- •2.3. Описание алгоритмов с помощью временной диаграммы
- •Описание алгоритмов с помощью текстового описания
- •Лекция 3
- •3.2. Типы данных
- •3.3. Арифметические операторы
- •3.4. Операторы сравнения
- •3.5. Побитовые операторы
- •3.6. Кодовые таблицы
- •3.7. Ввод/вывод данных
- •Лекция 4
- •4.2. Переменные
- •4.3. Ввод/вывод данных
- •4.4. Арифметические операции
- •4.5. Взаимосвязь чисел и литер
- •Лекция 5
- •5.1. Базовые конструкции
- •5.2. Операторы базовых конструкций
- •If (условие) {операторы 1}
- •If совместно с else
- •Лекция 6
- •6.1. Функции
- •6.2. Массивы
- •6.3. Указатели
- •Лекция 7
- •7.1. Операции с файлами
- •7.2. Открытие текстового файла для записи
- •7.3. Открытие текстового файла для чтения
- •Программный файл генерации случайных чисел “generation.Exe”. В результате создается текстовый файл с именем “qwerty.Dot”.
- •Лекция 8
- •8.1. Создание и инициализация строк
- •8.2. Функции для работы со строками
- •Лекция 9
- •9.1. Структуры
- •9.2. Формирование контрольной суммы
7.2. Открытие текстового файла для записи
Для открытия и записи в файл используются переменная fstream <имя_переменной>; оператор <переменная_потока>.open(путь_к_файлу, режим);
Для закрытия файла используется оператор <переменная_потока>.close();
Пример: открытие файла1 для записи в колонку пяти вещественных чисел.
#include <iostream> //библиотека ввода/вывода
#include <windows.h> //установка команд операционной системы
#include <cstdio> //для функции gets()
#include <fstream> //потоки ввода/вывода в файлы;
using namespace std;
string Rus(string text) //установка вывода русского языка в строке
{CharToOem((LPCTSTR)text.c_str(), (LPSTR)text.c_str()); return text;}
int main()
{
int i, n=5; float a;
fstream file1; //объявляет имя потока для записи/чтения данных в файл
file1.open("C:\\SOURCE\\qwerty.dot", ios::out); //cоздается файл
cout<<Rus("Введите данные: ")<<endl;
for (i=0; i<n; i++)
{
cin>>a;
file1<<a<<endl; //запись переменной а в файл
}
file1.close(); //закрытие потока
return 0;
}
Если файл с таким именем уже существует, то он будет перезаписан, если файл не существует, то он создается заново. Следует следить за соответствием типа вводимой переменной. При любой попытке ввода литеры (char) вместо float файл заполняется n нулями и закрывается.
Пример: открытие файла1 для записи в строку пяти вещественных (целых) чисел.
#include <iostream> //библиотека ввода/вывода
#include <windows.h> //установка команд операционной системы
#include <cstdio> //для функции gets()
#include <fstream> //потоки ввода/вывода в файлы;
using namespace std;
string Rus(string text) //установка вывода русского языка в строке
{CharToOem((LPCTSTR)text.c_str(), (LPSTR)text.c_str()); return text;}
int main()
{
int i, n=5; float a;
fstream file1; //объявляет имя потока для записи/чтения данных в файл
file1.open("C:\\SOURCE\\qwerty.dot", ios::out); //cоздается файл
cout<<Rus("Введите данные: ")<<endl;
for (i=0; i<n; i++)
{
cin>>a;
file1<<a<<" "; //запись переменной а в файл
}
file1.close(); //закрытие потока
return 0;
}
Пример: открытие файла2 для записи 3-х строк (пробел – начало следующей строки).
#include <iostream> //библиотека ввода/вывода
#include <windows.h> //установка команд операционной системы
#include <cstdio> //для функции gets()
#include <fstream> //потоки ввода/вывода в файлы;
using namespace std;
string Rus(string text) //установка вывода русского языка в строке
{CharToOem((LPCTSTR)text.c_str(), (LPSTR)text.c_str()); return text; }
int main()
{
int i, n=3; string a;
ofstream file2; //объявляет имя потока для записи строки в файл
file2.open("C:\\SOURCE\\qwerty.dot", ios::out);
cout<<Rus("Введите данные: ")<<endl;
for (i=0; i<n; i++)
{
cin>>a;
file2<<a<<endl; //запись строки а в файл
}
file2.close(); //закрытие потока
return 0;
}
Использование указанного файла во многих случаях не совсем удобно, т.к. символы перехода на новую строку, табуляции, пробел в операторе cin интерпретируются компилятором как нуль-символ (конец строки). Например, при вводе строки без пробела
Иванов-36лет
Петров-17лет
Сидоров-50лет
в файл все запишется корректно, как есть.
Но, при вводе
Иванов – 36 лет
Петров – 17 лет
Сидоров – 50 лет
в файл все запишется
Иванов
–
36
Поэтому более корректно использовать строчные переменные, содержащие как сами данные, так и их наименование. Для выхода из цикла можно использовать любую заданную строку (например, eof), но ни в коем случае не пытаться внести вручную символ операционной системы “конец файла”, который компилятор создает автоматически при закрытии файла. Попытка эмуляции символа “конец файла” (например, Ctrl^Z ) обычно приводит к зависанию программы.
Пример: открытие файла3 для записи произвольного числа строк (с пробелами).
#include <iostream> //библиотека ввода/вывода
#include <windows.h> //установка команд операционной системы
#include <fstream> //потоки ввода/вывода в файлы;
using namespace std;
string Rus(string text) //установка вывода русского языка в строке
{CharToOem((LPCTSTR)text.c_str(), (LPSTR)text.c_str()); return text;}
int main()
{
string str; // объявляется длина строки
fstream file3; //объявляется имя потока для записи данных в файл
file3.open("C:\\SOURCE\\qwerty.dot", ios::out);
cout<<Rus("Введите данные: ")<<endl;
while (str!="eof")
{
getline(cin,str);
file3<<str<<endl; //запись пока не введена строка eof
}
file3.close(); //закрытие потока
return 0;
}
В полученном файле имеем
Иванов – 36 лет
Петров – 17 лет
Сидоров – 50 лет
eof
Для избавления от внесенной строки eof следует в редакторе Notepad уничтожить эту строку.
Запись в файл символьного массива фиксированной длины и фиксированного числа строк может осуществляться следующим образом.
Пример: открытие файла4 для записи символьного масива длиной 80 литер в 3 строки.
y1=3 – первая цифра зачетки
y2=7 – вторая цифра зачетки
#include <iostream> //библиотека ввода/вывода
#include <windows.h> //установка команд операционной системы
#include <cstdio> //для функции gets()
#include <fstream> //потоки ввода/вывода в файлы;
using namespace std;
string Rus(string text) //установка вывода русского языка в строке
{
CharToOem((LPCTSTR)text.c_str(), (LPSTR)text.c_str());
return text;
}
int main()
{
int i,n=3; //объявляется число строк для отображения на экране
char str[80]; //объявляется длина символьного массива
fstream file4; //объявляется имя потока для записи данных в файл
file4.open("C:\\SOURCE\\qwerty.txt", ios::out);
cout<<Rus("Введите данные: ")<<endl;
for (i=0; i<n; i++)
{
gets(str); //считывание одной строки с консоли
file4<<str<<endl; //запись строки в файл
}
file4.close(); //закрытие потока
return 0;
}
При использовании этого способа нужно четко следить за количеством строк и размером символьного массива.
Созданный файл С:\\SOURCE\\qwerty.txt можно прочитать любым текстовым редактором с установкой кодировки CP866. При использовании MS Word следует: Open with/Microsoft OfficeWord/MS-DOS, а при использовании Notepad – Open with/Notepad (Format/Font/Terminal).
