Слайд 2Потоки и файлы
Потоки
Потоковый ввод/вывод дисковых файлов
Указатели файлов
Обработка ошибок файлового ввода/вывода
Слайд 3Потоки
Поток — это общее название потока данных.
cin
cout
для ввода/вывода вместо
традиционных функций С для файлов —fscanf(),. fprintf()..
Слайд 5Таблица . Флаги форматирования класса ios
ios
Слайд 6Все без исключения флаги могут быть выставлены с помощью методов
setf() и unsetf(). Пример:
cout.setf ( ios::left ): //выравнивание текста
по левому краю
cout >> "Этот текст выровнен по левому краю"
cout.unsetf ( ios:: left ): //вернуться к прежнему форматированию
Таблица 12.2. Манипуляторы ios без аргументов
Слайд 7Таблица Манипуляторы ios с аргументами
Слайд 9Потоковый ввод/вывод дисковых файлов
Классы ifstream, ofstream и fstream объявлены в
файле FSTREAM.
Старые функции языка С, такие, как fread() и fwrite()
в C++ работают,
Запись данных
// Форматированный вывод в файл с использованием <<
#include // для файлового ввода вывода
#include
#include
using namespace std;
int main() {
char ch = 'x';
int j = 77;
double d = 6.02;
string str1 = "Kafka"; // строки без пробелов
string str2 = "Proust";
Слайд 10ofstream outfile("fdata.txt"); //создать объект ofstream
outfile
// вставить //(записать) данные
<< j
<< ' ' // пробелы между числами
<< d
<< str1
<< ' ' // пробелы между строками
<< str2;
cout << "Файл записан\n";
return 0;
}
Слайд 11Чтение данных
// форматированное чтение из файла с помощью >>
#include
// для файлового
ввода/вывода
#include
#include
using namespace std;
int main() {
char ch; int j; double d;
string str1; string str2;
ifstream infile ( "fdata.txt“ ); // создать объект ifstream
// извлечь (прочесть) из него данные
infile >> ch >> j >> d >> str1 >> str2;
cout << ch << endl // вывести данные
<< j << endl
<< d << endl
<< str1 << endl
<< str2 << endl;
return 0;
}
Слайд 12Строки с пробелами
// файловый вывод строк с пробелами
#include
// для операций
// файлового ввода/вывода
using namespace std;
int main() {
ofstream outfile("TEST.TXT"); // создать выходной файл
// отправить текст в файл
outfile << "Приходит март. Я сызнова служу.\n";
outfile << "В несчастливом кружении событий \n";
outfile << "изменчивую прелесть нахожу \n";
outfile << "в смешеньи незначительных наитий.\n";
return 0;
}
Слайд 13getline()
// Файловый ввод (извлечение из файла) строк
#include
// для файловых функций
#include
using namespace std;
int main() {
const int MAX = 80; // размер буфера
char buffer [MAX]; // буфер символов
ifstream infile ("TEST.TXT"); // создать входной файл
while( !infile.eof() ) // цикл до EOF
{
infile.getline(buffer, MAX); // читает строку текста
cout << buffer << endl; // и выводит ее
}
return 0;
}
Слайд 14Ввод/вывод символов
// Посимвольный файловый вывод
#include
// для файловых функций
#include
#include
using
namespace std;
int main() {
string str = "Время – великий учитель, но, увы, "
"оно убивает своих учеников. Берлиоз";
ofstream outfile("TEST.TXT"); // Создать выходной файл
for(int j=0; j outfile.put( str[j] ); // записывать в файл
cout << "Файл записан\n";
return 0;
}
Слайд 15// Посимвольный файловый ввод
#include
// для файловых функций
#include
using namespace std;
int main()
{
char ch; // символ для считывания
ifstream infile("TEST.TXT"); // входной файл
while( infile ) // читать до EOF или ошибки
{
infile.get(ch); // считать символ
cout << ch; // и вывести его
}
cout << endl;
return 0;
}
Слайд 16Двоичный ввод/вывод
// Двоичный ввод/вывод целочисленных данных
#include
// для файловых потоков
#include
using namespace std;
const int MAX
= 100; // размер буфера
int buff[MAX]; // буфер для целых чисел
int main() {
for ( int j=0; j buff[j] = j; // (0, 1, 2, ...)
// создать выходной поток
ofstream os("edata.dat", ios::binary);
// записать в него
os.write(reinterpret_cast(buff), MAX*sizeof(int) );
os.close(); // должен закрыть его
buff[j] = 0;
// создать входной поток
ifstream
is("edata.dat", ios::binary);
// читать из него
is.read( reinterpret_cast(buff), MAX*sizeof(int) );
for(j=0; j if ( buff[j] != j )
{ cerr << "Некорректные данные!\n"; return 1; }
cout << "Данные корректны\n";
return 0;
}
Слайд 18 При работе с бинарными данными в качестве второго параметра
write() и read() следует использовать ios::binary
Оператор reinterpret_cast
Закрытие файлов
close()
Открытие
файлов
Функция ореn()
Слайд 19Таблица 12.10. Биты режимов
Указатели файлов
Функции seekg() и tellg() позволяют устанавливать
и проверять текущий указатель чтения, а функции seekp() и tellp()—
выполнять те же действия для указателя записи.
Слайд 20Рис. Функция seekg() с одним аргументом
Рис. 12.5. Функция seekp() с
двумя аргументами
Слайд 21// seekg.cpp Поиск конкретного объекта в файле
#include
// для файловых потоков
#include
using namespace std;
person
{ // класс person
protected:
char name[80]; // имя человека
int age; // его возраст
public:
void getData() { // получить данные о человеке
cout << "\n Введите имя: "; cin >> name;
cout << " Введите возраст: "; cin >> age;
}
void showData(void) { // вывод данных о человеке
cout << "\n Имя: " << name;
cout << "\n Возраст: " << age;
}
};
Слайд 22int main() {
person pers;
// создать объект person
ifstream
infile; // создать входной файл
infile.open("GROUP.DAT",ios::in|ios::binary); // открыть файл
infile.seekg(0, ios::end); // установить указатель на 0
// байт от конца файла
int endposition = infile.tellg(); // найти позицию
int n = endposition / sizeof(person); // число человек
cout << "\nВ файле " << n << " человек(а)";
cout << "\nВведите номер персоны: ";
cin >> n;
int position = (n-1) * sizeof(person); // умножить размер
// данных под персону на число персон
infile.seekg(position); // число байт от начала
// прочитать одну персону
infile.read( reinterpret_cast(&pers), sizeof(pers) );
pers.showData(); //вывести одну персону
cout << endl;
return 0; }
Слайд 23// Обработка ошибок ввода/вывода
#include
// для файловых потоков
#include
using namespace std;
#include
// для exit()
const int MAX = 1000;
int buff[MAX];
int main() {
for (int j=0; j buff[j] = j;
ofstream os; // создать выходной поток
// открыть его
os.open (“c:\\temp\\edata.dat", ios::trunc | ios::binary);
if(!os)
{ cerr << "Невозможно открыть выходной файл\n"; exit(1); }
cout << "Идет запись...\n"; // записать в него содержимое
// буфера
Слайд 24os.write( reinterpret_cast(buff), MAX*sizeof(int) );
if(!os) { cerr
// надо закрыть поток
for(j=0; j buff[j] = 0;
ifstream is; // создать входной поток
is.open(" c:\\temp\\ edata.dat", ios::binary);
if(!is)
{ cerr << "Невозможно открыть входной файл\n";exit(1); }
cout << "Идет чтение...\n"; // чтение файла
is.read( reinterpret_cast(buff), MAX*sizeof(int) );
if(!is)
{ cerr << "Невозможно чтение файла\n"; exit(1); }
for(j=0; j if( buff[j] != j )
{ cerr << "\nДанные некорректны\n"; exit(1); }
cout << "Данные в порядке\n";
return 0; }