Video: Week 0, continued 2024
Bir dosya ya da bir dosya örneği oluşturarak bir dosyayı açtığınızda, bayraklar olarak adlandırılanları sağlayarak dosyanın açılma şeklini değiştirebilirsiniz. Bilgisayar terimlerinde bayrağı basitçe varlığı veya varlığı olmaması, bir işleve nasıl bir şeyler yapacağını söyleyen küçük bir üründür. Ofstream ve ifstream sınıfları ile, söz konusu fonksiyon kurucudur.
Tamamen ANSI uyumlu olmayan bir derleyici kullanıyorsanız veya tamamen ANSI uyumlu bir bayt kullanıyorsanız ios_base:: apl gibi görünen bayrak, ios:: app gibi görünür. Bu belirli bayrak, bir dosyaya yazmak istediğiniz anlamına gelir, ancak bir dosyada olabilecek mevcut verilere eklemek istersiniz. Bu bayrak, aşağıdaki örneklerden birinde olduğu gibi ofstream için yapıcının bir bağımsız değişkeni olarak sağlanır:
ofout çıktı dosyası ("AppendableFile. Txt", ios:: app); ofstream çıktı dosyası ("AppendableFile. txt", ios_base:: app);
Bayrağın yapıcıya ikinci bir parametre olarak eklendiğini görebilirsiniz. Uygulamanın yanı sıra diğer bayraklar da var ve bunları or operatörü, | kullanarak tarayabilirsiniz. Örneğin, bir bayrak ios:: nocreate (yeni derleyicilere dahil değildir).
Bu, "zaten mevcutsa dosyayı aç" anlamına gelir. "Yani, eğer mevcut değilse dosyayı yaratma. (Unutma, ofstream zaten yoksa bir dosya oluşturur.) Dosya mevcut değilse, açık başarısız olur ve başarısız olarak çağırdığınızda gerçek bir 'ı geri alırsınız.
ios:: nocreate bayrağı, ios:: app ile kullanışlıdır. Bu, birlikte, varolan bir dosyayı açar ve ona ekler. Yani, ikisi birlikte yalnızca, dosya zaten mevcutsa çalışacak ve çağrı, dosyayı bir ekleme işlemi için açacaktır. Dosya zaten yoksa, dosya oluşturulmaz. Örnek bir arama:
ofstream çıktısı ("… / MyFile. Txt", ios:: app | ios:: nocreate); if (outfile. fail ()) {cout << "dosyası açılamadı!" << endl; return 0;} çıktı dosyası << "merhaba" << endl; ÇıkışDosyası. kapat();
If MyFile. Bu kodu çalıştırdığınızda txt mevcut değil, iletiyi alırsınız dosyayı açılamadı! Ama eğer MyFile. txt mevcutsa, uygulama açar, Hi dize ekler ve sonunda kapatır.
Yeni Standart Kütüphane'de nocreate bayrağı mevcut değildir. Aylak. Bu nedenle kod, yalnızca kitaplığın önceki bir sürümünü kullanıyorsanız çalışır. Code:: Blocks derleyici kullanırken, aşağıdaki hata iletisini görürsünüz:
hatası: 'nocreate' üyesi değil '; std:: ios '
Ancak, belirli derleyicinizin ios:: nocreate özelliğini destekleyen bir kitaplık içerdiğini test etmek isteyeceksiniz.Yeni Standart Kitaplığı içerse bile derleyiciniz zaten bunu destekleyebilir. Ios:: nocreate'e bir alternatif olarak, aşağıdaki kodu (FileOutput02 örneğinde bulunur) kullanabilirsiniz:
ifstream infile ("… / MyFile. Txt"); if (infile. fail ()) {cout << "dosyası açılamadı!" << endl; geri dönüş 0. kapat(); ofstream outfile ("… / MyFile. txt", ios:: app); outfile << "merhaba" << endl; ÇıkışDosyası. kapat();
Bu durumda, dosyayı okumak için açmaya çalışmaya başlarsınız. Dosya yoksa, dosyayı okuyamazsınız ve kod bir hata mesajıyla çıkar. Kod dosyadan okunabiliyorsa, dosyanın yazılması için yeniden açılır. Bu, hantal bir geçici çözüm, ancak çalışıyor.
Aşağıda, mevcut bayrakları listelemektedir. Tamamıyla ANSI uyumlu olmayan bir derleyici kullanıyor iseniz, ilk olarak ios için olanlar şunlardır:
-
ios:: app: Bu bayrak, bir dosyayı açmak ve ona dosya eklemek istediğiniz anlamına gelir.
-
ios:: in: Bir dosyadan okumak isterseniz bu bayrağı ekleyin.
-
ios:: out : Bir dosyaya yazmak istiyorsanız bu bayrağı ekleyin.
-
ios:: trunc : Dosyaya yazmadan önce dosyanın içeriğini temizlemek istiyorsanız bu bayrağı ekleyin. Eklemenin tam tersi ve ayrıca ios:: app'u kesinlikle içermiyorsanız varsayılan seçenek.
-
ios:: nocreate : Dosyanın mevcut olmaması durumunda dosyanın açılmamasını sağlamak için bu bayrağı kullanın, böylece dosyanın açılmasına neden olmazsınız.
-
ios:: noreplace : Bu bayrak nocreate'in tam tersi. Yalnızca yeni bir dosya oluşturmak istiyorsanız bu bayrağı kullanın. Bu bayrağı kullanırsanız ve dosya zaten varsa, dosya açılmaz ve bu hata "true" değerini döndürür.
ANSI uyumlu derleyiciler ios:: noreplace bayrağını da desteklemezler. Bu durumda, burada gösterildiği gibi (ve FileOutput03 örneğinde bulunan) ios: nocreate bayrağı için düzeltmenin tersini kullanabilirsiniz:
ifstream infile ("… / MyFile. Txt"); if (! infile. fail ()) {cout << "dosya zaten var!" << endl; geri dönüş 0. kapat(); ofstream çıktı dosyası ("… / MyFile. txt"); outfile << "merhaba" << endl; ÇıkışDosyası. kapat();
Bu durumda, kod dosyayı okumak için açmaya çalışır. Dosya varsa, kod bir hata iletisi gösterir ve çıkar. Aksi takdirde kod yeni bir dosya oluşturur ve ona yazar.
Aşağıdaki bayraklar kesinlikle ANSI uyumlu bir kompliyörde mevcuttur!
-
ios:: ate: Dosyayı açtıktan sonra dosyanın sonuna gitmek için bu bayrağı kullanın. Normalde, dosyaya veri eklemek istediğinizde bu bayrağı kullanın.
-
ios_base:: binary: Açtığınız dosyanın ikili verileri, yani karakter dizilerini temsil etmeyen verileri tutacağını belirtmek için bu bayrağı kullanın.
-
ios_base:: in: Bir dosyadan okumak istediğinizde bu bayrağı belirtin.
-
ios_base:: out: Bir dosyaya yazmak istediğinizde bu bayrağı ekleyin.
-
ios_base:: trunc: Bir dosyanın içeriğini yazmadan önce silip silmek istiyorsanız bu bayrağı ekleyin.
-
ios_base:: app: Dosyaya eklemek istiyorsanız bu bayrağı ekleyin. Trunc'ün tam tersi - yani, dosyayı açtığınızda dosyada zaten bulunan bilgiler orada kalacak.
Neden bir bayrak ve bayrak bayrağı istiyorsun? Bilgisayar, bir dosyaya yazıp yazmadığınızdan veya dosyanızdan okumakta olup olmadığınızı bilmelidir (sırasıyla) veya kullanıp kullanmama üzerine bağlıdır. Bir bayrak ve bayrak bayrak sahibi olduğunuza yönelik cevap, ofstream ve ifstream'in yanında başka sınıfların da bulunabilmesidir.
ANSI standardını henüz tam olarak desteklemeyen derleyiciler kütüphanelerinde fstream adlı genel bir sınıfa sahiptirler. ANSI uyumlu derleyiciler kütüphanelerinde basic_filebuf adında bir şablon sınıfı ve filebuf adı verilen bir sınıfı vardır. Bu sınıfları kullanırsanız, giriş ve çıkış bayrakları kullanabilirsiniz.