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:
bu monitör ne kadar büyükC++
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; }
GFG.textDosyadan 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: WelcomeBunda 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 dataDosya 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ış
İ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 GeeksForGeeksDiğ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:
Test Oluştur
- Dosya Silmek için C++ Programı
- Mevcut Bir Dosyaya Dize Ekleme
- Bir Dosyayı Başka Bir Dosyaya Kopyala