PDA

Tam Sürümünü Görmek İçin : yaratmak istemiyorum..


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..


Volkan Uzun
15/07/2005, 00:29
soyle bir cevap buldum:
The ios::nocreate setting did not make it into the ISO 14882:1998 C++
standard. Too platform specific.

You can simulate that behavior with:

fstream foo("foo.txt", ios_base::in);
if(!fs) {
// File does not exist.
// Do not create one.
}
else {
foo.close();
foo.open("foo.txt", ios_base::out);
}

Note: the ios::xxxxx settings are from the defunct <fstream.h> header file.
While the ios_base::xxxxx are from the <fstream> (notice, no .h suffix)
header file, within the std namespace.

sckz
15/07/2005, 00:32
bismillahirrahmanirrahim..
by the name of Allah..

sanal_programci verdiğin örnek benimkinin neredeyse aynısı.. bende web i deşince buldum..
ama ben yanıtımı aldım... cevap şurada saklı :
The ios::nocreate setting did not make it into the ISO 14882:1998 C++
standard. Too platform specific.

sckz
15/07/2005, 00:54
pardon sadece ilk sorumun yanıtını aldım.. diğerleri hala duruyor..

Volkan Uzun
15/07/2005, 01:16
3. icin release modda derleyip dernemisin

sckz
15/07/2005, 01:31
3. icin.. release olarak ta derledim.. yine aynı... yani sapık sapık cevaplar veriyor..

Volkan Uzun
15/07/2005, 01:41
kodu bir attach et bakalim

sckz
15/07/2005, 02:08
yukaridaki kodun aynisi.. ama ben yine de attach edeyim (ceviz.net .cpp uzantısını kabul etmiyordu bende .txt ye cevirdim) :

Volkan Uzun
15/07/2005, 02:21
ben dos acip cagirirsam calisiyor.
vc den cagirirsan da file exenin oldugu yerde degil solution folderinda olmali

sckz
15/07/2005, 02:42
vc den cagirirsan da file exenin oldugu yerde degil solution folderinda olmaliBiliyoruz canım o kadarını 8).. hatta visual studio içinde add new item > text file yaptığım için o debug ya da release e atmıyor.. solution klasörüne atıyor..

zaten visual studio dan çağırınca gül gibi çalışıyor... sorun cmd.exe den çağırdığımda başlıyor..

Volkan Uzun
15/07/2005, 02:43
bende hicbir soru cikmadi,
her yerden cagirdim. calisti, cmdden, vc den, explorerdan.

karamemed
15/07/2005, 09:33
Bende de sorunsuz çalıştı.