Привіт!
В даній статті висвітлена робота з файлами за допомогою класу fstream який міститься в стандартній бібліотеці STL.
Методи класу
Розглянемо декілька основних методів, які найчастіше використовуються у операціях над файлами.
void open (const char* filename,
ios_base::openmode mode = ios_base::in | ios_base::out) ;
Використовується, очевидно, для відкриття файлу. Передаються два параметри: перший це ім'я файлу у вигляді масива символів (якщо ім'я файлу міститься в об'єкті класу string використовуйте метод c_str з даного об'єкту); наступний праметр - прапорці доступу до файлу, які Ви бажаєте отримати:
- fstream::in - даний прапорець вказує на намір читання з файлу;
- fstream::out - даний прапорець використовується для вивід у файл або запис;
- fstream::ate - даний прапорець спричиняє відриття файлу і подальше встановлення курсору вводу у його кінець;
- fstream::binary - даний прапорець викликає не символьне читання файлу;
- fstream::app - дані виводу у файл додаються до його контенту;
- fstream::trunc - пред відкриванням файлу, увесь його вміст стирається.
void close() ;
Закриває файл, який в даний момент асоціюється з поточним об'єктом, роблячи неможливим подальші спроби запису або читання. Дана функція відкривається автоматично під час виклику деструктора об'єкта.
bool is_open() ;
Даний метод, викликаний з поточного об'єкта fstream, поверне true, якщо об'єкт асоційований з будь-яким файлом і false, якщо файл не відкрито.
ostream& operator << ( /* typename */ val) ;
Де typename може бути любий з вбудованих типів С++ або специфікаторів чи потокових буферів. Даний метод виводить в файл, асоційований з поточним об'єктом fstream, значення передане даному перевантаженому оператору.
istream& operator >> ( /* typename */ val) ;
Де typename може бути любий з вбудованих типів С++ або специфікаторів чи потокових буферів. Даний метод записує в передану зміну відповідне їй значення з файлу.
istream& seekg (streampos pos) ;
istream& seekg (streamoff off, ios_base::seekdir way) ;
Даний метод встановлює поточну позицію читання або запису в передане їй значення. В другому варіанті методу, перший параметр являється зміщенням відносно позиції вказаної у другому параметрі, які можуть бути наступними:
- ios_base::beg - початок файлу;
- ios_base::cur - поточна позиція файлу;
- ios_base::end - кінець файлу.
streampos tellp() ;
Повертає поточну позицію файлу в якості цілого числа.
Приклади
Розглянемо наступний простий приклад відкриття тектового файлу і запис у нього рядка символівю.
#include <fstream> /* файловий клас */
#include
using namespace std;
int main (int argc, char** argv)
{
/* об'єкт файлого потоку */
fstream file ;
/* спроба відкрити файл */
/* відкриваємо тільки для виводу
** і стираємо попередній вміст */
file.open ("Sample1.txt", fstream::out | fstream::trunc) ;
/* перевіряємо чи файл відкритий */
if (!file.is_open())
{
/* якщо файл не відкрито - показуємо помилку */
cout << "Error while open file!\n" ;
/* і виходимо з програми */
return 0 ;
}
/* якщо файл успішо відкорито - виводимо повідомлення у нього */
file << "Hallo, World! This is Sample1! User params:\n" ;
/* разом з параметрами командного рядка */
for (unsigned int iter=1; iter<argc; ++iter)
{ file << argv[iter] << "\n" ; }
/* закриваємо файл */
file.close () ;
/* виходимо з програми */
return 0 ;
}
Після компілювання і виконання даного коду можна отрмати результат (код міститься у файлі "sample1.cxx", за допомогою команди "cat" виводимо вміст файлу у термінал):
Приклад у якому у файл записуються випадкові числа, після чого програма зчитує їх з нього і записує назад сортованими в порядку зростання. Сортування виконується за допомгою Бульбашкового сортування.
/*
** Дана програма демонструє читання і запис
** файлу за допомогою класу fstream.
*/
#include <fstream> /* файловий клас */
#include <iostream> /* вивід в термінал */
#include <string> /* ім'я файлу */
#include <stdlib.h> /* функція rand () */
#include <time.h> /* time */
using namespace std ;
/* кількість цифер з якими будемо працювати */
const unsigned int N = 10 ;
int main (int argc, char** argv)
{
/* об'єкт файлого потоку */
fstream file ;
/* ім'я файлу з яким будемо працювати */
string filename = "Sample2.txt" ;
/* відкриваємо файл для запису */
file.open (filename.c_str(), fstream::out | fstream::trunc) ;
/* перевіряємо успішність відкриття */
if (!file.is_open())
{
cout << "Fail to open file!" ;
return 0 ;
}
/* ініціалізовуємо генератор чисел */
srand (time(NULL));
/* заповнюємо файл випадковими числами до 100 розділеними пробілами */
for (unsigned int iter=0; iter<N; ++iter)
{ file << rand ()%100 << ' ' ; }
/* закриваємо файл */
file.close () ;
/* перевідкриваємо файл для читання */
file.open (filename.c_str(), fstream::in) ;
/* перевіряємо успішність відкриття */
if (!file.is_open())
{
cout << "Fail to open file!" ;
return 0 ;
}
/* масив в якому будуть міститись дані */
int iArray [N] ;
/* зчитуємо дані файлу в масив */
for (unsigned int iter=0; iter<N; ++iter)
{
/* число файлу у масив */
file >> iArray[iter] ;
/* виводиво дані на екран */
cout << iArray[iter] << ' ' ;
}
cout << '\n' ;
/* закриваємо файл */
file.close () ;
/* сортуємо масив Бульбашковим сортуванням */
for (unsigned int iter=1; iter<N; iter++) /* зовнішній цикл */
{
for (unsigned int jter=N-1; jter>=iter; jter--) /* внутрішній цикл */
{
if (iArray[jter]<iArray[jter-1]) /* умова перебору */
{
/* міняємо місцями значення масиву*/
/* зберігаємо значення більшого елементу в змінну */
int x = iArray[jter-1] ;
/* переміщамо менший елемент на одну позицію вліво */
iArray[jter-1] = iArray[jter] ;
/* більший елемент переміщаємо на одну позицію вправо */
iArray[jter] = x ;
}
}
}
/* відкриваємо файл для запису результату */
file.open (filename.c_str(), fstream::out | fstream::trunc) ;
/* перевіряємо успішність відкриття */
if (!file.is_open())
{
cout << "Fail to open file!" ;
return 0 ;
}
/* заповнюємо файл результатами сортування */
for (unsigned int iter=0; iter<N; ++iter)
{
file << iArray[iter] << ' ' ;
cout << iArray[iter] << ' ' ;
}
cout << '\n' ;
/* закриваємо файл */
file.close () ;
return 0 ;
}
Після компілювання і виконання даного коду (код міститься у файлі filesort.cxx), можна отримати результат:
Зверніть увагу, ща дані у файл записуються у тектовому представлені, а для запису і зчитування передається не текстова змінна типу int. Дані претворення автоматично виконуються у класі fstream. Якщо при відкритті файлу вказати fstream::binary, тоді файл у тектовому редакторі може виявитись нечетабельним.