Zdravím, mám dotaz ohledně výstupu do souboru. Mám globální * FILE ukazatel, výstup otevírám ve funkci file_open(), soubor se prokazatelně otevře, zapíšu text, a z funkce vystoupím, soubor je pořád otevřený.. V okamžiku, kdy se snažím do (otevřeného) proudu něco napsat mimo fci file_open(), tak se nezadaří. Myslel jsem, když mám globální ukazatel do souboru a otevřu ho jednou funkcí, tak mimo ni je stále otevřený a zavřu ho až budď ručně, nebo při skončení programu. Mohl by mně někdo vysvětlit, jak to vlastně, je? Díky
Fórum › C / C++
Chování otevřeného souborového proudu?
Dej sem kód
file_open() jsem nikdy nepoužil, ale normální fopen() by měl zůstat otevřenej i po skončení fce dokud ho neuzavřeš... v každým případě není moc dobrej nápad nechávat soubor stále otevřenej, prostě zapiš do souboru co potřebuješ a uzavři ho
Ale pokud ho chceš nechat otevřenej, tak nevolej fclose() :
#include <iostream>
#include <string.h>
void zapis(char* text, FILE* stream)
{
if (stream && text)
fwrite(text, sizeof(char), strlen(text), stream);
}
void main()
{
FILE* f = fopen("soubor.txt", "a+");
zapis("test", f);
}
Ale mám dojem, že ty asi otevíráš soubor v té funkci a chceš potom jen použík ten ukazatel, takže to můžeš udělat třeba takto
#include <iostream>
#include <string.h>
bool zapis(char* text, FILE*& stream, bool close = false)
{
if (!text)
return false;
if (stream)
fwrite(text, sizeof(char), strlen(text), stream);
else
{
FILE* f = fopen("soubor.txt", "a+");
fwrite(text, sizeof(char), strlen(text), f);
stream = f;
}
if (close)
fclose(stream)
return true;
}
void main()
{
FILE* myFile = 0;
zapis("test", myFile); // otevira soubor + zapis
zapis("xxx", myFile); // pouzije jiz otevreny soubor + zapis
zapis("yyy", myFile, true); // to same, jen uzavre soubor
}
Doufám, že to je jasný už =)
file_open() byla trochu dezinformace, je to má vlastní funkce, která otevře proud a zapíše hlavičku, v této fci je pak volána fopen()... Pro každý zápis bych mohl proud otevřít a zavřít, ale v případě logu programu, kde vypisuju kvanta věcí, je to mrhání výkonem. fclose() volám až na konci programu. Mimochodem, "FILE*& stream" parametr předává co přesně?
#4 kosta
predava presne referenci na misto v pameti, kde je ulozen pointer na otevreny soubor...
pokud mas jen FILE * f tak se adresa jen zkopiruje z puvodniho mista - a tim pokud se zmeni uvnitr funkce - zmeni se jen kopie a ne puvodni hodnota
A neřekl si, jestli to je v C nebo C++, protože zápis File*& ti v C nepude, tam bys musel File** a předat & z FILE*
jinak ti to KIIV vysvětlil...
co se týče uzavírání proudu, tak jak si přisel na to, že logovací systémy mají stále otevřenej stream? Tam máš buffer, do kterýho se zapisuje, čili se loguje (po řádcích) do bufferu a řeknemě, že každých 10 řádků se zapíše do souboru (nebo taky po nějaký akce app)... to záleží jak se logger využivá, ale pokud neuzavřeš stream, tak v souboru nic mít nebudeš a pro systémy, který jedou nonstop by měli stále prázdný LOG soubory
A tipuju, že to máš nějak takto (což funguje)
#include <iostream>
#include <string.h>
FILE* f = 0; // glob. file stream
void file_open() // otevre stream a zapise hlavicku
{
char* head = "hlavicka";
f = fopen("soubor.txt", "a+");
fwrite(head, sizeof(char), strlen(head), f);
}
void zapis(char* str) // zapise nejaky text
{
if (f && str)
fwrite(str, sizeof(char), strlen(str), f);
}
void main()
{
file_open(); // otevre stream a zapise hlavicku
zapis("xxx"); // nejaky zapis
zapis("yyy"); // nejaky zapis
fclose(f);
}
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Tahání dat z otevřeného vlákna — založil eXilim
Lze automaticky spouštět scripty i bez otevřeného prohlížeče? — založil Maniik
Rozbor dat z binárního proudu — založil Lenny
G++ - divne chovani — založil Koudis
Divné chování if-else — založil d.mostek
Moderátoři diskuze