Chování otevřeného souborového proudu? – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Chování otevřeného souborového proudu? – C / C++ – Fórum – Programujte.comChování otevřeného souborového proudu? – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
kosta
~ Anonymní uživatel
6 příspěvků
2. 7. 2012   #1
-
0
-

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

Nahlásit jako SPAM
IP: 217.115.249.–
Reklama
Reklama
Martin Kozibrátka0
Stálý člen
3. 7. 2012   #2
-
0
-

Dej sem kód

Nahlásit jako SPAM
IP: 46.28.104.–
Savana.cz - neomezený webhosting za pár kaček :)
ingiraxo+15
Grafoman
3. 7. 2012   #3
-
0
-

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ž =)


Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
kosta
~ Anonymní uživatel
6 příspěvků
3. 7. 2012   #4
-
0
-

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ě?

Nahlásit jako SPAM
IP: 217.115.249.–
KIIV+42
God of flame
3. 7. 2012   #5
-
0
-

#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

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ingiraxo+15
Grafoman
3. 7. 2012   #6
-
0
-

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);
}
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Martin Kozibrátka0
Stálý člen
3. 7. 2012   #7
-
0
-

#1 kosta
Někdy kus kódu řekne více, než spousta vět.

Nahlásit jako SPAM
IP: 46.28.104.–
Savana.cz - neomezený webhosting za pár kaček :)
kosta
~ Anonymní uživatel
6 příspěvků
4. 7. 2012   #8
-
0
-

2ingiraxo, 2KIIV, děkuji vám za odpovědi, pomohly mně.

2Martin, díky za moudro, sice jsi nepomohl, ale aspoň potěšil ;)

Nahlásit jako SPAM
IP: 217.115.249.–
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, 85 hostů

Moderátoři diskuze

 

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