Výstup do souboru – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Výstup do souboru – C / C++ – Fórum – Programujte.comVýstup do souboru – C / C++ – Fórum – Programujte.com

 

Matěj Pácha0
Super člen
10. 6. 2006   #1
-
0
-

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:

Nahlásit jako SPAM
IP: ...–
Ajem tíčr, andrgraund tíčr!
Jura_0
Stálý člen
10. 6. 2006   #2
-
0
-

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/

Nahlásit jako SPAM
IP: ...–
Matěj Pácha0
Super člen
11. 6. 2006   #3
-
0
-

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

Nahlásit jako SPAM
IP: ...–
Ajem tíčr, andrgraund tíčr!
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žit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 60 hostů

Podobná vlákna

Výstup do souboru — založil George

Vstup/vystup C — založil silent

Výstup preprocesoru? — založil pavelka

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý