2. Общие шаги
1. Включение заголовочного файла fstream в
программу.
2. Объявление файлового потока.
3. Связывание файлового потока с источником
ввода/вывода.
4. Открытие файла
5. Использование файлового потока с операциями
>>, <<, или другими функциями ввода/вывода.
6. Закрытие файла.
3. Файловый ввод/вывод в С++
Поток – последовательность символов
интерактивный (iostream)
cin – входной поток связанный с клавиатурой.
cout – выходной поток связанный с дисплеем.
cerr – выходной поток, в который направляются
сообщения об ошибках, связан обычно с дисплеем.
clog - то же, что cerr, но буферизирован.
в файл (fstream)
ifstream – определят новый входной поток (обычно
связанный с файлом).
ofstream – определяет новый выходной поток (обычно
связанный с файлом).
4. Заголовочные файлы
iostream – содержит основную информацию
необходимую для всех операций ввода/вывода
iomanip – содержит информацию полезную для
форматирования потока ввода/вывода через
манипуляторы
fstream – содержит информацию для файлового
ввода/вывода
strstream – содержит информацию для выполнения
операций ввода/вывод через память (т.е. через строки
в памяти)
5. ios базовый класс.
istream и ostream наследуется от ios
ifstream наследуется от istream (и ios)
ofstream наследуется от ostream (и ios)
iostream наследуется от istream и ostream (& ios)
fstream наследуется ifstream, iostream, и ofstream
Классы для потоков в C++
6. C++ потоки
//Добавляем заголовок
#include <fstream>
int main ()
{ /* Объявляем файловые потоки */
ifstream fsIn; // входной
ofstream fsOut; // выходной
fstream both //входной & выходной
//Открываем файлы
inData.open("prog.dat"); //открываем входной файл
outData.open("prog.out"); //открываем выходной файл
// Код работы с потоками
.
// Закрываем файлы
inData.close();
outData.close();
return 0;
}
7. Функция оpen()
оpen() это метод каждого класса ( fstream, ifstream,
ofstream)
void fstream :: open ( const char *filename, openmode
mode);
void ifstream ::
open ( const char *filename, openmode mode= ios::
in);
void ofstream ::
open ( const char *filename, openmode mode=
ios:: out | iso :: trunc);
9. Валидация файла перед обращением к
нему
//Проверить поток
if ( ! mystream)
{
cout << “Cannot
open file.n ”;
}
//Используя метод
//is_open()
if ( !
mystream.is_open()) {
cout << “File is
not open.n ”;
}
Первый подход Второй подход
10. Пример: открытие файла
#include <fstream>
using namespace std;
int main()
{
/* объявление и автоматическое
открытие файла*/
ofstream outFile(“fout.txt");
// валидация
if(! outFile) {
Cout << “Cannot open file.n ”;
return 1;
}
return 0;
}
#include <fstream>
using namespace std;
int main()
{
// декларируем выходной поток
ofstream outFile;
// открываем существующий файл
// fout.txt
outFile.open(“fout.txt”);
// валидация
if(! outFile.is_open() ) {
Cout << “Cannot open file.n ”;
return 1;
}
return 0;
}
С применением конструктора Используя метод open()
11. Пример: запись
#include <fstream>
using namespace std;
int main()
{ /* объявление и автоматическое
открытие файла */
ofstream outFile(“fout.txt");
//вывод как и в cout,
// пишем в файла
outFile << "Hello World!";
outFile.close();
return 0;
}
#include <fstream>
using namespace std;
int main()
{ // декларируем выходной поток
ofstream outFile;
// открываем существущий файл fout.txt
outFile.open(“fout.txt”);
//вывод как и в cout,
// пишем в файла
outFile << "Hello World!";
outFile.close();
return 0;
}
С применением конструктора Используя метод open()
12. Пример: чтение
#include <iostream>
#include <fstream>
int main()
{ // Открываем текстовый файл
ifstream openFile(“data.txt");
char ch;
// выполняем пока не конец файла
while( ! оpenFile.eof() )
{
оpenFile.get(ch); // получаем символ
cout << ch; // выводим в сout
}
оpenFile.close(); // закрываем файл
return 0;
}
#include <iostream>
#include <fstream>
#include <string> // для getline()
int main()
{ //октркываем файл
ifstream openFile(“data.txt");
string line;
while(!openFile.eof())
{//считать строку
getline(openFile, line);
cout << line;
}
openFile.close(); // close the file
return 0; }
Посимвольно Целой строки
13. Больше о функциях чтения
ifstream fsin;
fsIn.open(const char[] fname)
Связывает поток fsIn с внешним файлом fname.
fsIn.get(char& character)
Получает следующий символ из потока fsIn и
помещает в character.
fsIn.getline(char *buf, int n, char c = 'n')
Извлекает строку из потока.
fsIn.eof()
Проверяет конец файла.
fsIn >> c; // как cin
14. Больше о функциях записи
ofstream fsOut;
fsOut.open(const char[] fname)
Связывает поток fsOut с внешним файлом
fname.
fsOut.put(char character)
Помещает символ character в выходной поток
fsOut.
fsOut.eof()
tests for the end-of-file condition.
fsOut << c; //как cout
15. Флаги
Name Description
ios::in Открытие файла на чтение
ios::out Открытие файла на запись
ios::app Открытие на добавление. Вызывается ios::out
ios::ate Открытие на добавление. Не вызывается
ios::out
ios::trunc Удалить содержимое файла. (усечь до нулевой
длины)
ios::nocreate Если файл не существует, открытие с
помощью функции open() невозможно
ios::noreplace Если файл существует, попытка открытия
через функцию open() function, приведет к
ошибке
ios::binary Открыть в бинарном режиме
16. Файловые флаги
#include <fstream>
int main(void)
{
ofstream outFile("file1.txt", ios::out);
outFile << "That's new!n";
outFile.close();
Return 0;
}
Если необходимо установить больше фалгов просто
используйте оператор |. Таким образом:
ios::ate | ios::binary
17. Бинарный режим
Функции для бинарного режима
get(): Извлекает один символ из потока
istream& istream::get(unsigned char&);
put(): Помещает один символ в поток
ostream& ostream::put(char);
read(): Производит чтение блока символов
istream& istream::read(unsigned char *buf, int len);
write(): Производит запись блока символов
ostream& osteram::write(const unsigned char *buf, int n);
18. Работа с бинарными файлами
Некоторые полезные функции
seekg(): переход к определенной позиции для чтения
seekp():переход к определенной позиции для записи
tellg(): Возвращает текущую позицию чтения из потока
tellp(): Как и tellg() но для записи
flush(): Сбрасывает буфер в файл
19. Детальнее о перемещенияи
указателя
inFile.seekg(0) – перемещение указателя в начало файла
inFile.seekg(n, ios:beg) – перемещение позиции указателя на
n байт от начала файла
inFile.seekg(m, ios:end) – перемещение указателя на
m байт от конца файла
nFile.seekg(0, ios:end) – перемещение указателя в конец файла
Аналогичные операции в <ostream> и для функции seekp.
20. Пример
//Пример 1: Использование get() и put()
#include <iostream>
#include <fstream>
void main()
{
fstream File("test_file",ios::out | ios::in | ios::binary);
char ch;
ch='o';
File.put(ch); //помещение значения ch в поток
File.seekg(ios::beg); //переход в начало файла
File.get(ch); //чтение одного символа
cout << ch << endl; //отображение его
File.close();
}
21. Пример
//Пример 2: Использование read() и write()
#include <fstream.h>
#include <string.h>
void main()
{
fstream File("test_file.txt",ios::out | ios::in | ios::binary);
char arr[13];
strcpy(arr,"Hello World!"); //Помещаем данные в массив
File.write(arr,5); //помещаем первые 5 символов в файл т.е. "Hello"
File.seekg(ios::beg); //перемещаемся в начало файла
static char read_array[10]; //Будем считывать данные в эту переменную
File.read(read_array,3); //считываем первые 3 символа, т.е. "Hel"
cout << read_array << endl; //отображаем
File.close();
}
22. Пример
#include <fstream>
void main()
{
//Если у нас есть слово "Hello" в файле test_file.txt
ifstream File("test_file.txt");
char arr[10];
File.read(arr,10);
//мы должны увидеть 5, т.к. Hello длинной 5 символов
cout << File.tellg() << endl;
File.close();
}