file handling in c++
-
Upload
maxim-shaptala -
Category
Education
-
view
121 -
download
0
description
Transcript of file handling in c++
ФАЙЛОВЫЙ ВВОД/ВЫВОД В C++
Общие шаги
1. Включение заголовочного файла fstream в программу.
2. Объявление файлового потока.
3. Связывание файлового потока с источником ввода/вывода.
4. Открытие файла
5. Использование файлового потока с операциями >>, <<, или другими функциями ввода/вывода.
6. Закрытие файла.
Файловый ввод/вывод в С++
Поток – последовательность символов интерактивный (iostream)
cin – входной поток связанный с клавиатурой.· cout – выходной поток связанный с дисплеем.· cerr – выходной поток, в который направляются
сообщения об ошибках, связан обычно с дисплеем.· clog - то же, что cerr, но буферизирован.
в файл (fstream) ifstream – определят новый входной поток (обычно
связанный с файлом).
ofstream – определяет новый выходной поток (обычно связанный с файлом).
Заголовочные файлы
iostream – содержит основную информацию необходимую для всех операций ввода/вывода
iomanip – содержит информацию полезную для форматирования потока ввода/вывода через манипуляторы
fstream – содержит информацию для файлового ввода/вывода
strstream – содержит информацию для выполнения операций ввода/вывод через память (т.е. через строки в памяти)
ios базовый класс. istream и ostream наследуется от ios ifstream наследуется от istream (и ios) ofstream наследуется от ostream (и ios) iostream наследуется от istream и ostream (& ios) fstream наследуется ifstream, iostream, и ofstream
Классы для потоков в C++
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;
}
Функция о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);
Имя файла
Опционально, определяет как файл должен быть открыт
Можно сочетать несколько флагов вместе
Объект и метод open()
input_stream.open("numbers.dat“)
Имя потока
Вызываемый объект
Оператор
точка
Имя метода
Имя файла
Dir:\\folder\fileName.extention
Extention ( .dat, .out, .txt)
Валидация файла перед обращением к нему
//Проверить поток
if ( ! mystream) { cout << “Cannot open file.\n ”;}
//Используя метод //is_open()
if ( ! mystream.is_open()) {
cout << “File is not open.\n ”;}
Первый подход Второй подход
Пример: открытие файла
#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()
Пример: запись
#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()
Пример: чтение
#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; }
Посимвольно Целой строки
Больше о функциях чтения 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
Больше о функциях записи
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
Флаги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 Открыть в бинарном режиме
Файловые флаги
#include <fstream>int main(void){
ofstream outFile("file1.txt", ios::out);outFile << "That's new!\n";outFile.close();
Return 0;}
Если необходимо установить больше фалгов просто используйте оператор |. Таким образом: ios::ate | ios::binary
Бинарный режим
Функции для бинарного режима 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);
Работа с бинарными файлами
Некоторые полезные функции seekg(): переход к определенной позиции для чтения
seekp():переход к определенной позиции для записи
tellg(): Возвращает текущую позицию чтения из потока
tellp(): Как и tellg() но для записи
flush(): Сбрасывает буфер в файл
Детальнее о перемещенияи указателя
inFile.seekg(0) – перемещение указателя в начало файла
inFile.seekg(n, ios:beg) – перемещение позиции указателя на
n байт от начала файла
inFile.seekg(m, ios:end) – перемещение указателя на
m байт от конца файла
nFile.seekg(0, ios:end) – перемещение указателя в конец файла
Аналогичные операции в <ostream> и для функции seekp.
Пример
//Пример 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();
}
Пример
//Пример 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();}
Пример
#include <fstream>void main(){
//Если у нас есть слово "Hello" в файле test_file.txtifstream File("test_file.txt");char arr[10];File.read(arr,10);
//мы должны увидеть 5, т.к. Hello длинной 5 символов
cout << File.tellg() << endl; File.close();
}