Nainstaloval jsem si MS Visual C++ Express 2005 a nějak jsem nepochopil nový způsob výstupu do souboru pomocí fstream. Koukal jsem se do MSDN, ale jsem z toho jelen. Nemáte někdo zkušenosti? Nejsem extra OOP programátor, takže bych to rád nějak srozumitelně. Je to prostý výstup do textového souboru. Rád bych zachoval výstup pomocí fout.
Díííky :mimi:
Fórum › C / C++
Výstup do souboru
paashi napsal:
Nainstaloval jsem si MS Visual C++ Express 2005 a nějak jsem nepochopil nový způsob výstupu do souboru pomocí fstream. Koukal jsem se do MSDN, ale jsem z toho jelen. Nemáte někdo zkušenosti? Nejsem extra OOP programátor, takže bych to rád nějak srozumitelně. Je to prostě výstup do textovýho souboru. Rád bych zachoval výstup pomocí fout.
Díky :mimi:
Tak vystup do souboru si obvykle vyzada v knihach celou kapitolu, ale pokusim se vam to vysvetlit.
Takze nejprve ze vseho je potreba otevrit soubor. To se obyvkle, ovsem neni to pravidlem, dela rovnou pri inicializaci objektu(tedy v jeho konstruktoru):
Nejprve uvedu prototyp:
explicit ofstream ( const char * filename, openmode mode = out | trunc );
Samozrejme trida ofstream ma bezparametricky kontruktor, ale to neni nyni podstatne.
Prvnim parajmetrem je cesta/nazev k oteviranemu souboru.
Dalsim(druhym) parametrem je kombinace flagu(ty jsou zdedeny ze tridy ios_base).
Ukazkovy priklad otevreni TEXTOVEHO souboru paashi.txt pro zapis. A ekvivalentni zapis v cistem C:
C++:
std::ofstream fout("paashi.txt");
C:
FILE * fr = fopen("paashi.txt", "w");
Stejne jako v C, lze vyuzit zapisu do binarniho souboru. Ted nastava cas pro dalsi parametr konstruktoru, a tim je promenna openmode.Jak uz jsem uvedl, trida ofstream dedi tuto promennou(tipl bych, ze je to obycejny enum) ze tridy ios_base a to prave vyuziju v zapisu.Opet ekvivalentni zapis v C:
C++:
std::ofstream fout("paashi", ios_base::binary);
C:
FILE *fr = fopen("paashi", "wb");
To ovsem neni vse, co trida ofstrem poskytuje - dokaze otevrit soubor, jak pro zapis, orezani(truncate - parametr ios_base::trunc), pridani na konec souboru(append-parametr iso_base::app). Dokonce se da specifikovat i otevreni streamu pro cteni ios_base::in, ale i to se da realizovat v C.
Na zacatku jsem se zminil, ze otevreni pres konstruktor neni jedinou moznosti. Trida ofstream nam poskytuje metodu open, ktera umi to same jako vyse zmineny konstruktor a dokonce ma i obdobny zapis.
Prototyp:
void open ( const char * filename, openmode mode = out | trunc );
Maly priklad:
ofstream fout; // zavola se bezparametricky konstruktor
fout.open("paashi.txt");// zde se take da vyuzit druheho parametru, pro blizsi specifikaci otevreni souboru
//kontrola souboru
TAkze mam otevreno, ale je treba zjistit zdalipak nenastaly nejake potize. A to zjistim budto klasickym zapisem if(!fout) nebo vyuziju metody is_open(Ta vraci true pri uspesnem otevreni souboru):
bool is_open ( );
Priklad:
C++:
ofstream fout("paashi.txt");
if(fout.is_open()) // nebo if(!fout)
// neco delej
else
// nastala chyba
Otevreni souboru mame tedy za sebou. Nyni se prejdu k vami jiz dlouho ocekavane praci a to k zapisu do souboru. Nejprve uvede prikald pro zapis v textovem souboru. Zde se da krasne vyuzit operator bitoveho posunu doleva, tedy <<. Prace je obdobna jako s objektem cout.
Priklad zapisu v textovem rezimu:
C++:
// zde otevru soubor pro zapis
fout << "Tenhle retezec se zapise do souboru paashi.txt a odradkujen";
C:
fprintf(fr, "Tenhle retezec se zapise do souboru paashi.txt a odradkujen");
Nyni dlouho ocekavany vystup v binarnim rezimu - pouziti metody write.
Nejprve prototyp
ostream& write ( const char* str , streamsize n );
Zapis v binarnim rezimu:
C++
// otevreni paashi v binarnim rezimu
int cislo = 5;
fout.write((char*)&cislo, sizeof(cislo));
C:
int cislo=5;
fwrite((void*)&cislo, sizeof(cislo), 1, fr);
Tak otevreli jsem, zkontrolovali jsme, je-li soubor skutecne otevren, zapsali jsme a nyni, jak uz byva zvykem po sobe pekne uklidime - zavreme soubor:
C++
fout.close();
C:
fclose(fr);
Pokud jste se dodtal az sem, muzu vam jen poblahoprat k vasi trpelivosti. Tedkom vsechno shrnu
C++
#include <fstream>
using namespace std;
int main(int argc, char* argv[])
{
ofstream fout("paashi.txt"); // otevreni souboru pro zapis v text rezimu
if(fout.is_open())
{
fout << "Tenhle retezec se zapise do souboru paashi.txt a odradkujen"; // zapise do souboru a odradkuje
fout.close(); // zavre soubor
}
else
cerr << "Soubro se nepovedlo otevrit pro zapis!!!";
return 0;
}
C:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
FILE *fr = fopen("paashi.txt", "w");
if(fr)
{
fprintf(fr, "Tenhle retezec se zapise do souboru paashi.txt a odradkujen");
fclose(fr);
fr = NULL;
}
else
fprintf(stderr, "Nepovedlo se otevrit soubor pro zapis!!!");
return 0;
}
Nyni zapis v bin. rezimu(v C uz to psat nebudu):
#include <fstream>
using namespace std;
int main(int argc, char* argv[])
{
ofstream fout("paashi", ios_base::binary); // otevreni souboru pro zapis v bin. rezimu
if(fout.is_open())
{
int cislo = 5;
fout.write((char*)&cislo, sizeof(cislo));
fout.close(); // zavre soubor
}
else
cerr << "Soubro se nepovedlo otevrit pro zapis!!!";
return 0;
}
Cerpal jsem y:
http://cplusplus.com/ref/
Vyčerpávající! Díky! Takhle nějak jsem to zkoušel, jen jsem neměl tak úplně jasno, proč používám fout jako objek třídy ofstream, když vzápětí název fout používám jako funkci pro výstup do souboru. Už mi to funguje a je mi to jasnější.
Zjistit počet nových příspěvků
Přidej příspěvek
Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
Uživatelé prohlížející si toto vlákno
Uživatelé on-line: 0 registrovaných, 115 hostů
Podobná vlákna
Výstup do souboru — založil George
Vstup/výstup do souboru v kódování UTF-8 pomocí C++ — založil flukas
Vystup signálu z PC do TV — založil bengo
Vstup/vystup C — založil silent
Výstup preprocesoru? — založil pavelka
Moderátoři diskuze