Nadpisywanie tekstu po wysłaniu do pliku.

0

Dzień dobry,
Pisze w sprawie pomocy z zadaniem domowym. Mianowicie chodzi mi o nadpisywanie się tekstu w pliku HTML, potrzebuję do pliku dopisać tekst z kolejnej funkcji a tymczasem jest on nadpisywany w zależność którą funkcje wywołam w pierwszej kolejności. Uogólniając chodzi mi o to aby w pliku znajdował się jeden oraz drugi string. Próbowałem wyszukiwać rozwiązanie mojego problemu w Internecie niestety nic nie znalazłem, jest to być może problem tego iż nie potrafię go prawidłowo sformułować.

#include <iostream>
#include <fstream>
using namespace std;

ofstream plik( "raport.html" );

void naglowek(){
string h1h2 = "<h1>Nagłówek pierwszego stopnia</h1><br/><br/><h2>Nagłówek drugiego stopnia<h2>";
plik.open("raport.html", ios_base::app);
plik<<h1h2<<endl;
plik.close();

}

void headbody(){
string hb = "<head><title>ZADANIE C++</title></head><body>";
plik.open("raport.html", ios_base::app);
plik<<hb<<endl;
plik.close();

}

int main()
{
headbody();
naglowek();

    return 0;
}

Z góry dziękuje za pomoc :)

0

Po pierwsze, to nie rozumiem celu, który chcesz osiągnąć. pachnie, ale nie mam100% pewności, że źle zaplanowałeś atomy, części swojego projektu. Funkcje "coś" robią, ich nazwy kłamią, co robią (jednak czasowniki by były bardziej wyraziste) itd

Po drugie, C++ jest na tyle niskopoziomowym językiem, że nie ma jakiejś specyfiki jak "nadpisywanie HTML"
nadpisywanie (dowolnego typu) pliku tekstowego to jedno, zastępowanie to drugie (ma odpowiednie wzorce, jak to robi) itd

Próbowałem wyszukiwać rozwiązanie mojego problemu w Internecie niestety nic nie znalazłem, jest to być może problem tego iż nie potrafię go prawidłowo sformułować.

Wy młodzi szukacie algorytmów do liczenia brzoskwiń, gdy ten złośliwy niedobry internet podpowiada tylko algorytmy liczenia pomarańczy.
Masz szukać ELEMENTÓW do swojego rozwiązania, dołożyć własny wysiłek, złączyć swoje z tamtym - bo 100% pasującego gotowca to nie znajdziesz.

0

@zkubinski: Dokumentacje jak najbardziej przeczytam, już dla zapisywania zrobiłem osobną funkcje. Zobaczymy co z tego będzie :)

@zkubinski: Rozumiem co się dzieje tylko chodzi o to jak temu nadpisywaniu zapobiec.

0

@zkubinski: Niestety ten sam efekt :/
Ale dziękuję za pomoc przewertuję jeszcze tą dokumentacje i być może znajdę coś co pozwoli rozwiązać ten problem :)

0

@winci:

jest stos N (np pięciu) ksiazek

Masz niezbyt ogarniętego WIRTUALNEGO kolegę (nie @z)
Wytłumacz mu przez telefon, jak ma spowodować, by jeszcze jedna, N+1 (szósta) książka znalazła się na dole
Kolega jest tak debilny, że w ogóle nie kuma stwierdzenia o większej ilości książek, niż 1. W danej chwili nie skupi się na więcej niz jednej.

2

Nie otwieraj pliku ciągle na nowo.
Otwórz go raz i trzymaj otwartego tak długo, aż zakończysz wpisywanie wszystkiego co potrzebujesz.
Popraw kod tak:

#include <iostream>
#include <fstream>

void naglowek(std::ostream& plik)
{
    std::string h1h2 = "<h1>Nagłówek pierwszego stopnia</h1><br/><br/><h2>Nagłówek drugiego stopnia<h2>";
    plik << h1h2 << endl;
}

void headbody(std::ostream& plik)
{
    std::string hb = "<head><title>ZADANIE C++</title></head><body>";
    plik << hb << endl;
}

int main()
{
    std::ofstream plik("raport.html");
    naglowek(plik);
    headbody(plik);

    return 0;
}

i zacznij kombinować od tego.

standardowy komentarz: zmienne globalne to zło!

3

Oczywiście rozwiązanie @MarekR22 jest poprawne, natomiast w celu wyjaśnienia czemu ci nie działa Twoja wersja:

#include <iostream>
#include <fstream>
using namespace std;

ofstream plik("raport.html");

void headbody() {
    string hb = "<head><title>ZADANIE C++</title></head><body>";
    plik.open("raport.html", ios_base::app | ios_base::out);
    if (plik) {
        plik << hb << endl;
        plik.close();
    } else {
        std::cerr << "Failed to open\n";
    }
}

void naglowek() {
    string h1h2 = "<h1>Nagłówek pierwszego stopnia</h1><br/><br/><h2>Nagłówek drugiego stopnia<h2>";
    plik.open("raport.html", ios_base::app);
    plik << h1h2 << endl;
    plik.close();
}

int main() {
    headbody();
    naglowek();
    return 0;
}

A czemu się tak dzieje? Ano dlatego, że twoja zmienna globalna plik od razu otwiera plik raport.html do zapisu. Kolejne otwarcie kończy się porażką. Jeśli więc chcesz naprawić swoją wersję, to usuń ofstream plik("raport.html"); i wstaw ofstream plik;, albo lepiej, po prostu zrób tak jak proponuje @MarekR22

@zkubinski przepraszam, ale nie pomagasz

2

Jak dla mnie zachowanie jest faktycznie zaskakujące, bo plik jest otwierany z ios_base::app, a więc powinno appendować. Ale z tego co widzę plik jest już otwarty w tej linijce, gdzie nie specyfikujesz app:

ofstream plik( "raport.html" );

Potem otwierasz już otwarty plik.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0