4 Aralık 2018 Salı

Streamler std::ifstream Sınıfı

Giriş
Şu satırı dahil ederiz.
#include <fstream>
constructor - char * 
Metodun imzası şöyledir.
explicit ifstream (const char* filename, ios_base::openmode mode = ios_base::in);
Bu metod C++11'den önce kullanılırdı. Eğer std::string geçmeye kalkışırsak şu hatayı alırdık
no matching function for call to 
'std::basic_ifstream<char>::basic_ifstream(std::string&)'
Dolayısıyla şöyle yapmak gerekirdi.
string input = ...;
ifstream file (input.c_str());
constructor - wchar_t
ifstream sınıfı wchar_t alan bir constructor sunmuyor. Ancak Visual Studioa'da böyle bir constructor var. Kod portable olsun kaygısı yoksa kullanılabilir.

constructor - std::string
Bu metod C++11 ile geldi. Şöyle yaparız.
string input = ...;
ifstream file (input);
constructor - char * + open_mode
Binary olarak açmak için şöyle yaparız.
ifstream file("myData.raw", ios::binary);
Text olarak açmak için şöyle yaparız.
ifstream myData("myData.txt");
exceptions metodu
Şöyle yaparız.
std::string const path = ...;
std::ifstream file;
file.exceptions (std::ios::badbit | std::ios::eofbit | std::ios::failbit);
file.open (path, std::ios::binary);
gcount metodu
Bu metod en son unformatted okuma işleminin kaç byte okuduğunu döndürür.
file.read(thefile, size))
file.gcount();
is_open metodu
Şöyle yaparız.
ifstream file;
file.open("salt.txt"); //open the file

if(file.is_open()) //if file is open
{...}
open metodu
Metodun imzası şöyledir. constructor ile aynı imzaya sahip.
std::ifstream::open( const char * filename, ios_base::openmode mode=ios_base::in)
Dosyayı açma işleminin başarılı olup olmadığı fail() ile kontrol edilebilir.
file.open(filename);
if (file.fail())
{
  std::cout << "File is not found!";
  exit(1);
}   
else
{...}
openmode parametresi
ifstream ios_base sınıfından kalıttığı için open mode şöyle kullanılabilir. Yani ios_base::in ile ifstream::in arasında bir fark yok.
ifstream file;
file.open("largefile.dat", ifstream::binary | ifstream::in);
Tablo şöyle
ios::in : Open file for reading data.
ios::out :Creates file if it does not exist. All existing data is erased from the file as new data is written into the file.
ios::app : Creates file if it does not exist. New data is written at the end of the file without disturbing the existing data.
ios::ate : Open file for output. Data can be written anywhere in the file, similar to append.
ios::trunc :Discard file content, which is the default action for ios::out.
ios::binary : Open file in binary (non-text) mode.
1. openmode parametresi - in modu
ifstream biz kodlamasak bile her zaman ios::in modunda açılır.

2. openmode parametresi - ate modu
ios::ate kullanırsak okuma işareti dosyanın sonuna getirilir. Böylece dosyanın büyüklüğünü öğrenebiliriz.

3. openmode parametresi - binary modu
Dosya ios::binary modda açılmazsa tellg() ile büyüklüğünü doğru öğrenemeyebiliriz. Örneğin bazı Windows "\n" karakterini "\r\n" ile değiştirebilir.
ifstream file ("file", ios::binary|ios::ate);
long N = file.tellg ();
read metodu
Belirtilen byte sayısı kadar okumaya çalışır.
uint8_t byte;
in.read((char*) (&input_byte), 1);
rdbuf metodu
Dosyanın tamamını okumamızı sağlar. ostringstream rdbuf nesnesini eof oluncaya kadar okur.
const char *filename = ...
ifstream in(filename);

ostringstream contents;
contents << in.rdbuf();
in.close();
Dosyayı başka dosyaya kopyalamamızı sağlar.
ifstream stream1("...");
ofstream stream2("...");
stream2 << stream1.rdbuf();
seekg metodu
Metod ismindeki g ve p uzantıları get ve put anlamına gelir. Açıklaması şöyle.
SEEKG() is used to move the get pointer to a desired location with respect to a reference point.
TELLG() is used to know where the get pointer is in a file.
SEEKP() is used to move the put pointer to a desired location with respect to a reference point.
TELLP() is used to know where the put pointer is in a file.
Not 1 : 32 bit işletim sistemlerinde 2GB'den büyük dosyalarda seekg kullanırken dikkatli olmak gerekir. Dosya binary açılmış olmalıdır. Text dosyalarda seekg yanlış sonuç verebilir. Yani şöyle yapılmamalı.
ifstream input("data.txt");
input.seekg(25);
Not 2 : ifstream'de seekg metodu var. ofstream de is seekp metodu var.

Okuma işaretini belirtilen konuma getirir.
file.seekg(0, std::ios::beg);
Şöyle de kullanılabilir.
file.seekg (0, file.beg);
Sondan bir önceki konuma şöyle gideriz.
file.seekg(-1,ios_base::end);    // go to one position before the EOF
Ya da şöyle yaparız.
long int seek_length = -1l;
file.seekg (seek_length, std::ios_base::end);
tellg metodu
Şöyle yaparız.
ifstream        file{"/tmp/test.bin", ios::binary};

// Record file length
size_t beg = file.tellg();

file.seekg( 0, ios::end );
size_t fileEnd = file.tellg();
unset metodu
Şöyle yaparız.
filestream.unsetf (std::ios::skipws);
Böylece tüm dosya okunur.
std::string str;
std::copy(std::istream_iterator<char>(filestream),
  std::istream_iterator<char>(), std::back_inserter(str));



Hiç yorum yok:

Yorum Gönder