C++'da Dosya İşleme

C++'da Dosya İşleme

Dosya işleme, C++ standart kitaplığı tarafından sağlanan sınıfları kullanarak dosyalardan okuma ve dosyalara (.txt .csv vb. gibi) yazma anlamına gelir.

  • Programların RAM'de çalıştırılması, verilerin yalnızca program çalışırken mevcut olduğu, program sona erdiğinde RAM'deki tüm verilerin otomatik olarak kaybolduğu anlamına gelir.
  • Dosya işleme, verilerin ikincil bellekte (HDD veya SSD gibi) saklanmasına olanak tanır, böylece kalıcı olarak korunabilir ve program sonlandırıldıktan sonra bile kaydedilebilir ve erişilebilir.
  • Dosya işlemleri için C++ dosya akışı sınıflarını sağlar. ofstream ifstream fstream gibi bir başlık.

Dosya Açma

Bir dosyadan okumadan veya dosyaya yazmadan önce onu açmamız gerekir. Bir dosyayı açmak, o dosyayı RAM'e yükler. C++'da bir dosyayı, ona bir akış oluşturarak açarız. f akışı dosya akışını temsil eden sınıf, yani dosyaya giriş ve çıkış akışı.

C++
   fstream     str  (  'filename.ext'       mode  );   

Neresi



  • cadde: Akışa verilen ad
  • dosya adı: Dosyanın adı
  • mod : Dosyayla etkileşimde bulunacağımız yolu temsil eder.

Dosya Açma Modları

Dosya açma modu, dosyanın okuma, yazma veya ekleme amacıyla açıldığını gösterir. Aşağıda C++'daki tüm dosya modlarının listesi bulunmaktadır:

Mod Tanım
ios::içinde Dosya okumak için açıldı. Dosya mevcut değilse açma işlemi başarısız olur.
ios::dışarı Dosya yazma için açık: dahili akış arabelleği çıktı işlemlerini destekler.
ios::ikili İşlemler metin yerine ikili modda gerçekleştirilir.
ios::ate Çıkış konumu dosyanın sonunda başlar.
ios::uygulama Tüm çıktı işlemleri, dosyanın mevcut içeriğine eklenen sonunda gerçekleşir.
ios::gövde Dosya açılmadan önce dosyada bulunan tüm içerikler atılır.

Örneğin dosyayı okumak için açmak istiyorsak aşağıdaki açma modunu kullanırız:

C++
   fstream     filein  (  'file.txt'       ios  ::  in  );   

Benzer şekilde dosyayı yazmak için açmak istiyorsak aşağıdakileri kullanırız:

C++
   fstream     fileout  (  'file.txt'       ios  ::  out  );   

Bu modlar OR operatörü (|) kullanılarak da birleştirilebilir. Örneğin, dosya akışını gösterildiği gibi hem okuma hem de yazma modunda açabilirsiniz:

C++
   fstream     str  (  'file.txt'       ios  ::  in     |     ios  ::  out  );   

Yazma modunda açılan dosya mevcut değilse yeni bir dosya oluşturulur. Ancak okuma modunda açılan dosya mevcut değilse yeni dosya oluşturulmaz ve bir istisna oluşturulur

Diğer Dosya Akışları

f akışı C++ tarafından sağlanan tek dosya akışı değildir. İki özel akış daha var:

  • ifstream : Giriş dosyası akışını temsil eder. Fstream'i açmaya eşdeğerdir. ios::içinde modu.
  • akış : Çıkış dosyası akışını temsil eder. Bu, fstream'i açmaya eşdeğerdir. ios::dışarı modu.

Yukarıdaki modlar bu akışlar için varsayılan modlardır. Bu modlar değiştirilemez ancak diğer modlarla birlikte birleştirilebilir. Şimdi giriş için gösterildiği gibi ifstream'i de kullanabiliriz:

C++
   ifstream     filein  (  'file.txt'  );   

Benzer şekilde çıktı için:

C++
   ofstream     fileout  (  'file.txt'  );   

Verileri Dosyaya Yaz

Dosya yazma modunda açıldığında, f akışı veya akış yazma işlemini cout'ta olduğu gibi kullanarak gerçekleştirebiliriz. < < operator.

C++
   #include          using     namespace     std  ;   int     main  ()     {      // Open a file      ofstream     file  (  'GFG.txt'  );          // Write the string to the file      file      < <     'Welcome to GeeksforGeeks.'  ;      return     0  ;   }   
yazmakGFG.text

Dosyadan Veri Oku

Dosya fstream veya ifstream kullanılarak okuma modunda açıldığında, yazma işlemini cin kullanarak benzer şekilde gerçekleştirebiliriz. >> operatörü.

C++
   #include          using     namespace     std  ;   int     main  ()   {      // Open a file in read mode      ifstream     file  (  'GFG.txt'  );      string     s  ;      // Read string from the file      file     >>     s  ;      cout      < <     'Read String: '      < <     s  ;      return     0  ;   }   


Çıkış

 Read String: Welcome  

Bunda cin ile aynı sorun var. Giriş yalnızca ilk boşluk karakterine kadar alınır. Bunu önlemek için şunu kullanabiliriz: getline() gösterildiği gibi çalışır:

C++
   #include          using     namespace     std  ;   int     main  ()   {      // Open a file in read mode      ifstream     file  (  'GFG.txt'  );      string     s  ;      // Read string from the file      getline  (  file       s  );      cout      < <     'Read String: '      < <     s  ;      return     0  ;   }   


Çıkış

 Read String: Welcome to GeeksforGeeks.  

Dosyanın Kapatılması

Dosyayı kapatmak, ilgili akışı kapatmak ve kullandığımız kaynakları serbest bırakmak anlamına gelir. Özellikle uzun süre çalışan programlarda, bellek sızıntılarını, veri kaybını vb. önlemek için, işiniz bittikten sonra dosyayı kapatmanız önemlidir.

C++'da dosyalar şu komut kullanılarak kapatılır: kapalı() tüm dosya akışlarında mevcut olan üye işlevi.

C++
   #include          using     namespace     std  ;   int     main  ()   {      // Open a file in read mode      ifstream     file  (  'GFG.txt'  );      string     s  ;      // Read string from the file      getline  (  file       s  );      cout      < <     'Read String: '      < <     s  ;      // Close the file      file  .  close  ();      return     0  ;   }   


Çıkış

 Read String: Welcome to GeeksforGeeks.  

Dosya İşlemedeki Hatalar

Dosya işlemede, dosyanın bulunamaması, diskin dolu olması vb. gibi birçok farklı türde hata meydana gelebilir. Programlarımız yaygın hataları beklemeli ve bunları doğru şekilde işleyebilmelidir. Dosya işleme sırasında meydana gelebilecek bazı yaygın hatalar şunlardır:

Dosya Açma Hatası

Dosyanın mevcut olmaması veya programın açma izninin olmaması gibi çeşitli nedenlerden dolayı dosyanın açılmadığı durumlar olabilir. Bu durumda aşağıdaki komutu kullanabiliriz: is_open() Dosyanın başarıyla açılıp açılmadığını kontrol etmek için dosya akışı sınıflarının üye işlevi.

C++
   #include          using     namespace     std  ;   int     main  ()     {      fstream     file  (  'nonexistent_file.txt'       ios  ::  in  );      // Check if the file is opened      if     (  !  file  .  is_open  ())     {      cerr      < <     'Error: Unable to open file!'      < <     endl  ;      return     1  ;      }      file  .  close  ();      return     0  ;   }   


Çıkış

 Error: Unable to open file!  

Veri Okuma/Yazma Hatası

Diğer bir yaygın hata, yanlış mod vb. nedenlerle verinin okunamaması veya yazılmamasıdır. Bu durumda, her okuma/yazma denemesinden sonra işlemleri doğrulayabiliriz. Örneğin getline() kullanarak okuma, gösterildiği gibi doğrulanabilir:

C++
   #include          using     namespace     std  ;   int     main  ()     {      fstream     file  (  'GFG.txt'       ios  ::  out  );      if     (  !  file  .  is_open  ())     {      cerr      < <     'Error: Unable to open file!'      < <     endl  ;      return     1  ;      }      string     line  ;          // Checking if getline() read successfully or not      if     (  !  getline  (  file       line  ))      cerr      < <     'Error: Failed to read data'      < <     endl  ;      file  .  close  ();      return     0  ;   }   


Çıkış

 Error: Failed to read data  

Dosya Sonu (EOF) Hatası

Dosyanın sonunun ötesinde okumaya çalışmak EOF hatasına neden olabilir. Okumadan önce dosyanın sonunu kontrol etmediğinizde bu durum meydana gelebilir. EOF'yi kullanarak kontrol edebiliriz eof() üye işlevi.

C++
   #include          using     namespace     std  ;   int     main  ()   {      ifstream     file  (  'GFG.txt'  );      if     (  !  file  .  is_open  ())      {      cerr      < <     'Error: Unable to open file!'      < <     endl  ;      return     1  ;      }      string     line  ;      while     (  getline  (  file       line  ))      cout      < <     line      < <     endl  ;      // Check for eof      if     (  file  .  eof  ())      cout      < <     'Reached end of file.'      < <     endl  ;      else      cerr      < <     'Error: File reading failed!'      < <     endl  ;      file  .  close  ();      return     0  ;   }   


Çıkış

 Reached end of file.  

EOF'yi kontrol etmeden önce okuma işlemini de doğruladığımıza dikkat edin. getline() yalnızca geri dönecek nullptr Herhangi bir nedenden dolayı okuma başarısız olsa bile.

İkili Dosyaları İşleme

C++'da da halledebiliriz ikili dosyalar Verileri ham formatta saklayan. İkili verileri okumak ve yazmak için aşağıdakileri kullanmanız gerekir: ios::ikili ikili dosya oluştururken/açarken bayrak.

İkili Dosyaya Yaz

Bir ikili dosyaya veri yazmak için önce dosyayı açmamız veya oluşturmamız gerekir. ios::ikili modu.

C++
   #include         #include         #include          using     namespace     std  ;   int     main  ()   {      string     str     =     'Welcome to GeeksForGeeks'  ;      // Open a binary file for writing      ofstream     file  (  'fileBin.bin'       ios  ::  binary  );      // Check if the file is open      if     (  !  file  )      {      cerr      < <     'Error opening the file for writing.'  ;      return     1  ;      }      // Write the length of the string (size) to file first      size_t     strLength     =     str  .  length  ();      file  .  write  (  reinterpret_cast   <  const     char     *>  (  &  strLength  )     sizeof  (  strLength  ));      // Write the string to the binary file      file  .  write  (  str  .  c_str  ()     strLength  );      // Close the file      file  .  close  ();      return     0  ;   }   


Çıkış

yazmaİkiliİkili Dosya

İkili Dosyadan Okuma

Tıpkı bir ikili dosyadan veri okumak için veri yazmak üzere bir dosyayı ikili modda açtığımız gibi, dosyayı aşağıdakileri kullanarak okuma modunda açmalıyız: ios::içinde .

Sözdizimi:

C++
   fstream     fileInstance  (  'fileName.bin'       ios  ::  in  |     ios  ::  binary  );   
C++
   #include         #include         #include          using     namespace     std  ;   int     main  ()   {      string     str  ;      // Open the binary file for reading      fstream     file  (  'fileBin.bin'       ios  ::  in     |     ios  ::  binary  );      // Check if the file is open      if     (  !  file  )      {      cerr      < <     'Error opening the file for reading.'  ;      return     1  ;      }      // Read the length of the string (size) from the file      size_t     strLength  ;      file  .  read  (  reinterpret_cast   <  char     *>  (  &  strLength  )     sizeof  (  strLength  ));      // Allocate memory for the string and read the data      char     *  buffer     =     new     char  [  strLength     +     1  ];     // +1 for the null-terminator      file  .  read  (  buffer       strLength  );      // Null-terminate the string      buffer  [  strLength  ]     =     ''  ;      // Convert the buffer to a string      str     =     buffer  ;      // Print file data      cout      < <     'File Data: '      < <     str  ;      delete  []     buffer  ;      file  .  close  ();      return     0  ;   }   


Çıkış

 File Data: Welcome to GeeksForGeeks  

Diğer Dosya İşlemleri

Ayrıca C++ programımızdan bir dosyayı işlemek için daha fazla işlem yapabiliriz. Yaygın dosya işlemlerinden bazıları şunlardır:

  • Dosya Silmek için C++ Programı
  • Mevcut Bir Dosyaya Dize Ekleme
  • Bir Dosyayı Başka Bir Dosyaya Kopyala
Test Oluştur

En Makaleler

Kategori

Ilginç Haberler