- •Работа с текстовыми файлами
- •ФАЙЛ – это именованный набор данных, хранящийся на внешней памяти.
- •Курсор доступа для бинарных файлов
- •Основные операции работы с файлами (1)
- •Основные операции работы с файлами(2)
- •Операторы записи в поток-текстовые файлы.
- •Пример 1(текстовые файлы)
- •Продолжение –запись в файл
- •Продолжение 2-чтение из файла
- •Тест для проверки набрали в блокноте
- •Пример 2 Программа, которая читает файл с именем in_file и выводит все прочитанные
- •Другие способы чтения из текстового потока
- •Функция getline
- •Функция getline
- •Обработка случая, когда указанного файла не существует
- •Проверка на наличие файла (is_open)
- •Функция, которая считывает заданный по имени файл
- •Посимвольное чтение из файла с функцией
- •Описание функции two_space (чтение и запись символов в файл)
- •Функция дозаписи в файл
- •Пример 3 Добавление в текстовый файл
- •Добавление в файл строк -appendTextFile
- •Главная программа
- •Исходный и результирующий файлы
- •Пояснения 1
- •Пояснения 2
- •Пример 4.Текстовые файлы
- •Продолжение примера
- •Пояснения 1
- •Пояснения 2
- •Пример5. Написать программу, подсчитывающую общее количество символов count в текстовом файле. Предварительно файл
- •ПОЯСНЕНИЯ:
- •Пример6 . Написать программу, выполняющую несколько способов
- •Эти функции были рассмотрены раньше в других примерах
- •//Главная функция
- •case '2':
- •Пояснения
Тест для проверки набрали в блокноте
Исходный файл содержал ivanov
25 petrov 21 sidorova 22
Результирующий файл ivanov 25 petrov 21 sidorova 22
По умолчанию файлы открываются и создаются как текстовые.
Пример 2 Программа, которая читает файл с именем in_file и выводит все прочитанные из этого файла слова, разделяя их пробелом, в другой файл, названный out_file. (предварительно надо подготовить исходный файл строк in_file в той же папке, где буде эта программа). Чтение строк.
#include <iostream>
#include <fstream> //для работы с файлами #include <string>
using namespace std; int main()
{
ifstream infile("in_file.txt"); ofstream outfile("out_file.txt");
if ( !infile ) { cout << "Ошибка открытия входного файла.\n"; return -1; }
if ( !outfile ) {
cout << "Ошибка открытия выходного файла.\n"; return -2; } string word;//строка для ввода в память
while ( infile >> word ) outfile << word << ' '; //разделение пробелом in_file.close(); out_file.close();
return 0;}
//Здесь осуществляется ввод из файла, пока не получим конец файла, тогда //возвращается 0
Другие способы чтения из текстового потока
Чтение до разделителя функцией getline (input,куда читать,разделитель);
В качестве разделителя может выступать символ «минус». Считаем дату из следующего текстового файла date.txt:
2017−01−25 --- набрали ,например в блокноте и сохранили как date.txt
создадим:
ifstream input("date.txt");
Объявим
string year, month, day;
Читаем файл таким образом, чтобы соответствующие части файла попали в нужную переменную. Воспользуемся функцией getline
getline(input, year, '-'); getline(input, month, '-'); getline(input, day, '-');
Чтобы проверить, что все работает, выведем каждую переменную на экран через пробел: cout << year << ' ' << month << ' ' << day << endl;
Функция getline
•Чтение из потока производится с помощью оператора ввода ( ) или функции getline, которая позволяет читать данные из потока построчно
•Функция getline первым аргументом принимает поток, из которого нужно прочитать данные, а вторым — переменную, в которую их надо записать.
•getline возвращает ссылку на поток, из которого берет данные. Поток можно привести к типу bool, причем false будет в случае, когда с потоком уже можно дальше не работать.
•Переписать код так, чтобы он выводил все строчки из файла и ничего лишнего, можно так:
ifstream input(“my .txt");
string line;
while (getline(input, line)) { cout << line << endl; }
Функция getline
Обратите внимание, что переводы строки при выводе добавлены искусственно. Это связано с тем, что функция getline, на
самом деле, считывает данные до некоторого разделителя, причем по
умолчанию до символа перевода строки, который в считанную строку не
попадает!
Обработка случая, когда указанного файла не существует
Cитуация, когда по некоторым причинам неверно указано имя файла или файла с таким именем не может существовать в файловой системе. Например, набрали неверно имя файла
При запуске такого кода оказывается, что он работает, ничего не выво- дит, но никак не сигнализирует о наличии ошибки.
Желательно, чтобы программа не умалчивала об этом, а явно сообщала, что файла не существует и из него нельзя прочитать данные.
У файловых потоков существует метод is_open, который возвращает true, если файловый поток открыт и готов работать
Проверка на наличие файла (is_open)
1. Вариант
ifstream input("helol.txt"); string line;
if (input.is_open()){
while (getline(input, line)) { cout << line << endl; }
else { cout << "error!" << endl; }
файловые потоки можно приводить к типу bool, где значение true соответствует тому, что с потоком можно работать в данный момент.
if (input){
while (getline(input, line)) { cout << line << endl; }
else { cout << "error!" << endl; }
Функция, которая считывает заданный по имени файл
void Input_file(const string name)
{
ifstream input(name); if (input) {
string line;
while (getline(input, line))
{
cout << line << endl;
} } }
Кроме построчного чтения для работы с текстовыми файлами возможно посимвольное чтение из файла используются функции put() и get()
Посимвольное чтение из файла с функцией
#include <fstream> #include <stdlib.h> #include <iostream> using namespace std; int main(void){ //прототип
void two_space(ifstream& f ,ofstream& t);//используем функцию, два файла ifstream f_in("my_fil.txt");//связали с физическим файлом
ofstream f_out("my1.txt"); if(!f_in){
cout<<"file not open"<<endl;exit(1);} if(!f_out){
cout<<"file not open"<<endl; exit(1);} two_space(f_in,f_out);// обращение к функции f_in.close();//закрыли файлы после работы сними f_out.close();
return 0;
}
Описание функции two_space (чтение и запись символов в файл)
void two_space(ifstream& f,ofstream& t){ char c;
//функция get(c) для чтения символов из файла while(f.get(c)){
t.put(c);//функция для записи символов put(c) if(c=='\n')
t.put(c);//переход на другую строку пишем в //файл
}
}
