Работа с файлами
Пример работы с файлом
Общие сведения
Потоки для работы с файлами
Организация работы с файлами
Для работы с файлами в языке C++ используются потоки трех видов:
· поток ввода (класс ifstream);
· поток вывода (класс ofstream);
· поток ввода-вывода (класс fstream).
Класс ifstream используется для выполнения чтения данных из файлов. Поток ofstream – для записи данных в файлы. Поток fstream – для чтения и записи данных в файлы.
Для использования этих классов потоков необходимо в программу включить заголовочный файл < fstream >.
Для выполнения любых работ с файлом необходимо:
1) создать поток одного из классов файловых потоков;
2) связать созданный поток с конкретным файлом (открыть конкретный файл для работы);
3) выполнить необходимые действия с файлом (чтение / запись данных);
4) закрыть файл.
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); - файл открывается на вывод с добавлением записываемых данных в конец файла.