logo

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çindeDosya 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::uygulamaTüm çıktı işlemleri, dosyanın mevcut içeriğine eklenen sonunda gerçekleşir.
ios::gövdeDosya 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:

bu monitör ne kadar büyük
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; } 
yazmak' title=GFG.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' loading='lazy' title=İ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ış

ızgara düzeni
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