Работа с файлами
В 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();