C++ Работа с файлами

Работа с файлами

В C++ для работы с файлами используется библиотека «fstream»
благодаря ней мы можем создать классы (ifstream, fstream, ofstream), являющиеся потомками класса istream/ostream и позволяющие работать с потоками ввода/вывода (в данном случае под словом поток имеется в виду поток Байт).
Примечание: cin/cout итакже являются наследниками класса istream/ostream.
#include <fstream>

Для ввода русских символов необходимо добавить и изменить.
#include <Windows.h> //для платформы windows для вывода русских символов
SetConsoleCP(1251); //смена кодировки консоли на русские символы
SetConsoleCP(866); //смена кодировки консоли на кодировку по умолчанию

 

Запись в файл:

ofstream file_out; //экземпляр класса для записи в файл
file_out.open(“путь или название файла.txt”); //открываем файл (или создаем если он не создан), при таком вызове данные будут затираться.
//если ввести название файла, то он будет создан в папке с проектом

можно проверить что открытие успешно с помощью метода file_out.is_open(); — он возвращает true/false

В классе ofstream перегружен оператор << поэтому мы можем писать в файл как с cout
file_out <<data;

//если мы НЕ хотим удалять данные, то необходимо дописать
file_out.open(«путь/имя.txt»,ofstream::app);

По окончанию необходимо закрыть файл (разрушить доступ к нему из текущей программы)
file_out.close();


Сохранить экземпляр класса в файл:
Person c_Person(“Ivan”, 19);
file_out.write((char*) &c_Person, sizeof(Person));

По окончанию необходимо закрыть файл (разрушить доступ к нему из текущей программы)
file_input.close();

Метод write сохраняет данные побайтово, поэтому используется приведение к (char*), также указывается размер объекта в байтах.

Примечание: данные сохраняются в бинарном виде!!! В блокноте их не увидишь нормально…

Примечание: интересный момент, запись в файл происходит только в момент закрытия файла, т.е. если не закрыть файл или при огромном количестве записей или при логгировании нужно периодически открыть/закрывать файлы?


Чтение из файла:

ifstream file_input; //экземпляр класса для записи в файл
file_input.open(“путь или название файла.txt”); //открываем файл
Если файла не существует/он занят и т.д. метод file_input.is_open(); вернет false.

bool file_input.get(…);//считываем побайтно (посимвольно), при этом эскейп последовательности НЕ игнорируются, возвращается true при удачном считывании.
while(file_input.get(value))    { cout<<value;  }

file_input.eof() – этот метод отлавливает конец файла и возвращает true

Считывание построчно:
В классе ifstream перегружен оператор >> поэтому мы можем читать из файла в строку (читаем до первого пробела)
Есть метод file_input.getline, но он не удобен, т.к. ему надо указывать количество символов.
Можно использовать метод getline из пространства std, он считывает до пеерхода на новую строку.
string buf;

while(!file_input.eof())
{
        buf="";
        //file_input>>buf;
        getline(file_input,buf);
        cout<<buf<<endl;
}

По окончанию необходимо закрыть файл (разрушить доступ к нему из текущей программы)
file_input.close();

 

Чтение экземпляра класса из файла:
Person c_Person2; //объект созданный конструктором по умолчанию

file_input.read((char*) &c_Person2, sizeof(Person));
После вызова этого метода в объекте c_Person2 будет данные из файла.
Метод read возвращает true пока может найти следующий блок данных и считать его.

По окончанию необходимо закрыть файл (разрушить доступ к нему из текущей программы)
file_input.close();

 

Одновременные чтение и запись файла:

Класс fstream позволяет писать и читать в файл одновременно, методы аналогичны методам классов ifstream и ofstream.

fstream fs;
fs.open(“file.txt”, fstream::in | fstream::out | fstream::app); //открываем файл на чтение и запись (с дозаписью)
//можно сделать проверку, что файл открыт
bool fs.open(file.txt);

По окончанию необходимо закрыть файл (разрушить доступ к нему из текущей программы)
file_input.close();

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *