12 Ekim 2017 Perşembe

Streamler std::ofstream Sınıfı

Giriş
Şu satırı dahil ederiz.
#include <fstream>
Bu sınıfın kardeşi wofstream Sınıfı.

Constructor - default
Şöyle yaparız.
std::ofstream ofs;
open metodu ile dosyayı daha sonra açmak gerekir.

Constructor - string
Dosyayı sıfırlayarak(truncate) açmak için şöyle yaparız. Açma bayrağı ios::out olur.
std::ofstream ofs ("my.txt");
Constructor - string + flag
Dosyayı sıfırlayarak(truncate) binary açmak için şöyle yaparız.
std::ofstream ofs ("my.bin", std::ios::binary);
Metin dosyaya eklemek yapmak için şöyle yaparız.
std::ofstream ofs("my.txt" | ios::app)
Constructor - FILE*
Bu constructor standart değil.  C ile beraber çalışabilmeyi sağlar. Ayrıca işletim sistemine mahsus özelliklerin kullanılmasını sağlar. Windows'ta metod imzası şöyle
explicit basic_ofstream(_Filet *_File)
    : _Mybase(&_Filebuffer),
        _Filebuffer(_File)
    {   // construct with specified C stream
    }

Dosyaya erişimin engellenmesi
Windows'ta dosyaya erişim şöyle engellenir.
FILE* pLockFile = _fsopen(tmpfilename.c_str(), "w", _SH_DENYWR );
if (pLockFile!=NULL
{
   // Write lock aquired
   ofstream ofs (pLockFile);
}

Dosyanın silinmesi
Windows'ta dosyanın kapanınca silinmesi şöyle sağlanır. Normalde fopen()' 'r' , 'w', 'a' karakterleri verilebilir. Ancak VS2015 ile fopen'a c ve D bayrakları da geçilebiliyor.
FILE* pCommitFile = fopen(tmpfilename.c_str(), "wcD");
if (pCommitFile!=NULL)
{
   // Commits when doing flush
   ofstream ofs (pCommitFile);
}
Eğer fopen yetersizse iki yöntem daha var.

1. CreateFile ile HANDLE yarat. Bu handle _open_osfhandle ile int'e çevrilir. int ise _fdopen ile FILE* yapısına çevrilir.
HANDLE file_handle = CreateFile(...);
int file_descriptor = _open_osfhandle((intptr_t)file_handle, 0);
FILE* file = _fdopen(file_descriptor, "w");
std::ofstream ofs (file);
2. _fsopen kullanılarak FILE* yaratılır.
FILE* pLockFile = _fsopen(...);
ofstream ofs (pLockFile);
close metodu
ofstream destructor'ı dosyayı kendi kapatır ve exception atılırsa yakalayıp ignore eder. Kendimizin dosyayı kapatması exception'ı yakalamamamız anlamına gelir. Aşağıdaki kodda close() çağırılması yanlıştır.
bool SomeClass::saveData()
{
  std::ofstream ofs (m_filename);

  if (!ofs.is_open ())
    return false;

  ofs << m_member1 << std::endl;
  ofs << m_member2 << std::endl;

  ofs.close (); // passed review only with this line
  return true;
}
flush metodu
Şöyle yaparız.
ofs.flush();
is_open metodu
Open işleminin başarılı olup olmadığını döner.
const string file_path = "...";
ofstream ofs (file_path.c_str(), ios::binary | ios::out);
if (!ofs.is_open ())
{
  cout << "Failure!" << endl;
  return false;
}
open metodu
açma için ofstream.open () metodu kullanılır. open metoduna geçilen açma parametreleri olarak std::ostream::out veya std::ofstream::out ya da aşağıdaki örneklerdeki gibi yapılabilir. Hepsi aynıdır.

Mevcut dosyayı sıfırlamak(truncate) için örnek
ofstream ofs;
ofs.open("my.txt",ios::out);
Mevcut dosyaya ekleme yapmak için örnek
ofstream ofs;
ofs.open("my.txt",ios::out|ios::app);
seekp metodu
Not : ifstream de seekg metodu var. ofstream de seekp metodu var.
Yazma konumunu değiştirmek için şöyle yaparız.
ofstream ofs;
int num = 2;

ofs.open("dat1", ios::app | ios::out | ios::in | ios::binary);

ofs.write((char *)num, sizeof(int));
f1.seekp (0);
tellp metodu
Yazma konumunu öğrenmek için şöyle yaparız.
long pos =  ofs.tellp();
write metodu
Şöyle yaparız.
if (ofs.write (taskToWrite->buffer,taskToWrite->length)) {
  // Success
}

Hiç yorum yok:

Yorum Gönder