- •Конспект лекций Часть 2 Оглавление
- •Часть 2 1
- •8. Указатели
- •8.1. Указатели Понятие указателя
- •Работа с указателями
- •Арифметика указателей
- •Ошибки при работе с указателями
- •If (p1) // Если указатель не равен 0, то все в порядке
- •8.2. Указатели и массивы
- •9. Функции и структура программы
- •9.1. Создание и использование функций Процедурный подход к разработке программ
- •Определение функций в программе
- •Завершение работы функции (инструкция return)
- •If ( Ошибка )
- •Список параметров функций
- •Обращение к функциям в программе
- •Передача данных по значению
- •Передача данных с помощью указателей
- •Передача данных по ссылке
- •Перегружаемые функции
- •Параметры по умолчанию
- •Функции с переменным числом параметров
- •Рекурсивное использование функций
- •Передача функций в качестве параметров
- •Встраиваемые функции (inline - функции)
- •Прототипы функций
- •9.2. Структура программы. Глобальные и локальные данные (области видимости и время жизни) Структура программы
- •Глобальные и локальные данные
- •Классы памяти
- •Доступ к полям структур
- •Указатели на структуры
- •Структурные параметры функций
- •Битовые поля структур
- •10.2. Объединения Обычные объединения
- •Анонимные объединения
- •10.3. Перечисления
- •Void WriteColor (тип_Спектр c )
- •11. Организация ввода/вывода и работа с файлами
- •11.1. Потоки для работы с файлами Общие сведения
- •Пример работы с файлом
- •Создание потока, открытие и закрытие файла
- •Запись и чтение данных в текстовых файлах
- •Запись и чтение данных в двоичном режиме
- •If ( !File ) // Проверили удалось ли открыть файл
- •Как обнаружить конец файла?
- •Прямой доступ при работе с файлами
- •If ( !File ) // Проверили удалось ли открыть файл
- •Статус потоков ввода-вывода
- •Некоторые другие функции управления потоками ввода-вывода
- •Примеры по работе с файлами
- •12. Работа с динамической памятью Распределение памяти при работе программы
- •Динамическое выделение и освобождение памяти в стиле c
- •Возможные ошибки при работе с динамической памятью
- •Динамические массивы
- •Продолжение следует …
11. Организация ввода/вывода и работа с файлами
11.1. Потоки для работы с файлами Общие сведения
Для работы с файлами в языке C++ используются потоки трех видов:
поток ввода (класс ifstream);
поток вывода (класс ofstream);
поток ввода-вывода (класс fstream).
Класс ifstream используется для выполнения чтения данных из файлов. Поток ofstream – для записи данных в файлы. Поток fstream – для чтения и записи данных в файлы.
Для использования этих классов потоков необходимо в программу включить заголовочный файл <fstream>.
Для выполнения любых работ с файлом необходимо:
создать поток одного из классов файловых потоков;
связать созданный поток с конкретным файлом (открыть конкретный файл для работы);
выполнить необходимые действия с файлом (чтение / запись данных);
закрыть файл.
Пример работы с файлом
bool Запись_данных_в_текстовый_файл (char * FileName)
{
ofstream File; // Создали поток вывода для записи данных в файл
File.open ( FileName ); // Открыли файл
if ( ! File.is_open () ) // Проверили удалось ли открыть файл
{
cout << "Открыть файл не удалось! \n";
return 0; // Файл не открыт
}
for (int I = 1; I <= 10; ++ I) // Записываем 10 строк в файл
File << "Строка " << I << endl;
File.close (); // Закрываем файл
return 1;
}
bool Чтение_данных_из_текстового_файла (char * FileName)
{
ifstream File; // Создали поток ввода для чтения данных из файла
File.open ( FileName ); // Открыли файл
if ( !File.is_open () ) // Проверили удалось ли открыть файл
{
cout << “Открыть файл не удалось! \n” ;
return 0; // Файл не открыт
}
char S[100];
while ( ! File.eof () ) // Читаем все строки из файла и выводим их на экран
{
File.getline ( S, 100 );
cout << S << endl;
}
File.close (); // Закрываем файл
return 1;
}
int main ()
{
setlocale (0, "");
if ( Запись_данных_в_текстовый_файл ( "E:\\test.txt" ) )
Чтение_данных_из_текстового_файла( "E:\\test.txt" );
system("pause");
return 0;
}
Создание потока, открытие и закрытие файла
Либо последовательность из двух инструкций:
ofstream File; - создали поток
File.open ( "E:\\test.txt" ); - связали поток с файлом (открыли файл)
Либо так:
ofstream File ( "E:\\test.txt" ); - создали поток и открыли файл
После открытия файла необходимо обязательно проверить открылся ли файл.
Если файл открыть не удалось, то переменная потока (File) принимает значение false, если файл открыт – true. Следовательно, проверку успешного открытия файла можно выполнит так:
if ( ! File)
// Ошибка
Еще один способ – использовать функцию потока is_open (), которая также возвращает логическое значение в зависимости от результата операции открытия файла:
if ( ! File.is_open () )
// Ошибка
Файл закрывается с помощью функции потока close ():
File.close ();
Подробнее об открытии файла. Каждый поток использует свой вариант функции open. Их прототипы выглядят так:
void ifstream::open ( const char * FileName,
ios::openmode Mode = ios::in );
void ofstream::open ( const char * FileName,
ios::openmode Mode = ios::out | ios::trunc );
void fstream::open ( const char * FileName,
ios::openmode Mode = ios::in | ios::out );
Первый параметр определяет имя открываемого файла (представляет собой массив символов).
Второй параметр определяет режим открытия файла. Этот параметр имеет значение по умолчанию, то есть является необязательным. Возможные значения этого параметра:
ios::app – при открытии файла на запись (поток ofstream) обеспечивает добавление всех выводимых в файл данных в конец файла;
ios::ate – обеспечивает начало поиска данных в файле начиная с конца файла;
ios::in – файл открывается для чтения из него данных;
ios::out – файл открывается для записи данных в файл;
ios::binary – открытие файла в двоичном режиме (по умолчанию все файлы открываются в текстовом режиме);
ios::trunc – содержимое открываемого файла уничтожается (его длина становится равной 0).
Эти флаги можно комбинировать с помощью побитовой операции ИЛИ (|).
Если файл открывается без использования функции open, эти флаги тоже можно использовать:
fstream File ( "E:\\test.txt", ios :: out | ios :: app ); - файл открывается на вывод с добавлением записываемых данных в конец файла.