Привіт! В даній статті висвітлена робота з файлами за допомогою класу 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" виводимо вміст файлу у термінал): sample1_output Приклад у якому у файл записуються випадкові числа, після чого програма зчитує їх з нього і записує назад сортованими в порядку зростання. Сортування виконується за допомгою Бульбашкового сортування.
/*
** Дана програма демонструє читання і запис 
** файлу за допомогою класу 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), можна отримати результат: writeread_file_and_sort_sample Зверніть увагу, ща дані у файл записуються у тектовому представлені, а для запису і зчитування передається не текстова змінна типу int. Дані претворення автоматично виконуються у класі fstream. Якщо при відкритті файлу вказати fstream::binary, тоді файл у тектовому редакторі може виявитись нечетабельним.