sckz
15/07/2005, 00:13
ios::nocreate ve ios::noreplace ile mum ışığında romantik bir gece...
Dosya ile işlemler yaparken bir yazıda ios::nocreate ve ios::noreplace in kullanımını gördüm.. Yazan kişi şöle demiş :
ios::nocreate ? mevcut olmayan dosyayı açmaktan kaynaklanan hata
ios::noreplace ? Dosya mevcutsa fakat ios::ate (1) veya ios::app (2) ayarlanmamışsa, dosyayı çıktı için açmaktan kaynaklanan hata..
(1) ios::ate ? seekg(0, ios::end); ve seekp(0, ios::end); ayarlar.. Yani hem okuma hemde çıktı sondan yapılır..
(2) ios::app ? seekp(0, ios::end); yani yazmaya sondan başla…
Ne güzel şimdi eğer var olmayan bir dosyayı yazmak için açma hatasına düşmemek için nocreate i kullanabilirim (miyim ?)…
Evet evet kullanabilir miyim ? sorusuna Msvc 7 ve mingw kullanamazsın diyo.. her ikisinde de verilen hatalar ‘nocreate’ is not member of ‘std::basic_ios…’ ve ‘nocreate’ undeclared identifier..
Web de bu nocreate ile noreplace in kullanımlarını gördüm.. hep aşağıdaki gibi :
ofstream outFile(“myfile.txt”, ios::nocreate);
bende bu şekilde kullandım ama çalışmadı..
Biraz da ortalığı deşince, bunun şöyle bir çözümünü buldum.. Önce dosyayı okumak için açmak, ifstream e ait nesne nin is_open() üye fonksiyonunu kullanarak, dosyanın gerçekten de açılıp açılmadığını kontrol etmek.. yani şöle :
ifstream inFile("myfile.txt");
ofstream outFile;
if (!inFile.is_open())
{
cout << "Dosya yok !";
}
else
{
inFile.close();
outFile.open("myfile.txt");
cout << "Dosya acildi...";
outFile << "aaa";
}
outFile.close();
Burda dosyayı önce okumak için açtığımda, dosya mevcut deilse yeni bir tane yaratılmıcaktır (yazmak için açmanın tersine).. Sonra infile.is_open() üye fonksiyonuyla dosyanın açılıp açılmadığını kontrol ettik (1).. Dosya mevcut deilse bundan dönen değer false olacaktır.. Dolayısıyla if içine girilip dosya yok mesajı alacaz.. Dosya acılabiliyorsa dosya mevcut demektir.. ve biz GÖNÜL rahatlığıyla dosyayı yazmak için açabiliriz.. Şimdi nocreate in işini yapan uzunca bişi bulduk..
(1) !infile ı da kullanabilirdik.. aslında aynı şey.. çünkü ifstream için operator!() üye fonksiyonu mevcut diye biliyorum.. o da bu işi yapıyor zaten..
Sonra denediğim birdiğer yöntem ios un rdstate() fonksiyonu idi… Bunu ifstream için kullandığımda mevcut dosya olmadığında 2 değerini dönüyor.. fakat ofstream için kullanamıyorum.. çünkü ofstream ile bi dosyayı açmak istediğimde, eğer mevcut değilse oluşturulduğu için, rdstate() den dönen değer her şart altında 0 oluyor..
Benim burdaki 1. sorunum neden nocreate ve noreplace için böle bi hata alıyorum, 2. sorunum yukaridaki çözüm sağlıklı mı (aynı şekilde noreplace için de çözüm üretilebilir) ve 3. sorunum en pisliği.. ben bu yukarıdaki alternatif çözümü derleyip çalıştırınca visual studio içinde sonuçların doğru olduğunu gördüm.. yani herşey beklediğim gibi calıştı… ama ben exe dosyasını alıp cmd.exe den çağırdığımda bana saçma sapan cevaplar veriyor.. bazen dosya varolduğu halde sürekli dosya yok diyor bazen de var diyor.. yani ne dediğini bilmiyor.. bunun denediğim aynı bilgisayara format atıp win i yeniden kurup tekrar denedim.. yine saçmalıyor.. sorun DOS ta mı yani her iki derleyici de de derlediğimde cmd.exe den bağımsız çalıştırdığımda sorun yok.. ama her ikisini de cmd.exe den çağırdığımda yine saçmalıyor..
Dosya ile işlemler yaparken bir yazıda ios::nocreate ve ios::noreplace in kullanımını gördüm.. Yazan kişi şöle demiş :
ios::nocreate ? mevcut olmayan dosyayı açmaktan kaynaklanan hata
ios::noreplace ? Dosya mevcutsa fakat ios::ate (1) veya ios::app (2) ayarlanmamışsa, dosyayı çıktı için açmaktan kaynaklanan hata..
(1) ios::ate ? seekg(0, ios::end); ve seekp(0, ios::end); ayarlar.. Yani hem okuma hemde çıktı sondan yapılır..
(2) ios::app ? seekp(0, ios::end); yani yazmaya sondan başla…
Ne güzel şimdi eğer var olmayan bir dosyayı yazmak için açma hatasına düşmemek için nocreate i kullanabilirim (miyim ?)…
Evet evet kullanabilir miyim ? sorusuna Msvc 7 ve mingw kullanamazsın diyo.. her ikisinde de verilen hatalar ‘nocreate’ is not member of ‘std::basic_ios…’ ve ‘nocreate’ undeclared identifier..
Web de bu nocreate ile noreplace in kullanımlarını gördüm.. hep aşağıdaki gibi :
ofstream outFile(“myfile.txt”, ios::nocreate);
bende bu şekilde kullandım ama çalışmadı..
Biraz da ortalığı deşince, bunun şöyle bir çözümünü buldum.. Önce dosyayı okumak için açmak, ifstream e ait nesne nin is_open() üye fonksiyonunu kullanarak, dosyanın gerçekten de açılıp açılmadığını kontrol etmek.. yani şöle :
ifstream inFile("myfile.txt");
ofstream outFile;
if (!inFile.is_open())
{
cout << "Dosya yok !";
}
else
{
inFile.close();
outFile.open("myfile.txt");
cout << "Dosya acildi...";
outFile << "aaa";
}
outFile.close();
Burda dosyayı önce okumak için açtığımda, dosya mevcut deilse yeni bir tane yaratılmıcaktır (yazmak için açmanın tersine).. Sonra infile.is_open() üye fonksiyonuyla dosyanın açılıp açılmadığını kontrol ettik (1).. Dosya mevcut deilse bundan dönen değer false olacaktır.. Dolayısıyla if içine girilip dosya yok mesajı alacaz.. Dosya acılabiliyorsa dosya mevcut demektir.. ve biz GÖNÜL rahatlığıyla dosyayı yazmak için açabiliriz.. Şimdi nocreate in işini yapan uzunca bişi bulduk..
(1) !infile ı da kullanabilirdik.. aslında aynı şey.. çünkü ifstream için operator!() üye fonksiyonu mevcut diye biliyorum.. o da bu işi yapıyor zaten..
Sonra denediğim birdiğer yöntem ios un rdstate() fonksiyonu idi… Bunu ifstream için kullandığımda mevcut dosya olmadığında 2 değerini dönüyor.. fakat ofstream için kullanamıyorum.. çünkü ofstream ile bi dosyayı açmak istediğimde, eğer mevcut değilse oluşturulduğu için, rdstate() den dönen değer her şart altında 0 oluyor..
Benim burdaki 1. sorunum neden nocreate ve noreplace için böle bi hata alıyorum, 2. sorunum yukaridaki çözüm sağlıklı mı (aynı şekilde noreplace için de çözüm üretilebilir) ve 3. sorunum en pisliği.. ben bu yukarıdaki alternatif çözümü derleyip çalıştırınca visual studio içinde sonuçların doğru olduğunu gördüm.. yani herşey beklediğim gibi calıştı… ama ben exe dosyasını alıp cmd.exe den çağırdığımda bana saçma sapan cevaplar veriyor.. bazen dosya varolduğu halde sürekli dosya yok diyor bazen de var diyor.. yani ne dediğini bilmiyor.. bunun denediğim aynı bilgisayara format atıp win i yeniden kurup tekrar denedim.. yine saçmalıyor.. sorun DOS ta mı yani her iki derleyici de de derlediğimde cmd.exe den bağımsız çalıştırdığımda sorun yok.. ama her ikisini de cmd.exe den çağırdığımda yine saçmalıyor..