• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zapisywanie do pliku tekstowego

Object Storage Arubacloud
+1 głos
398 wizyt
pytanie zadane 6 września 2016 w C i C++ przez Helmik Użytkownik (680 p.)

Witam, ostatnio chcąc poćwiczyć zapis i odczyt z pliku, zauważyłem, że plik w ogóle nawet się nie tworzy, a co dopiero nic się w nim nie zapisuje smiley. Oto kod:

 

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    fstream file("plik.txt");

    char key;

    while(true)
    {
        file.open("plik.txt", ios::in);
        if(file.good()==true)
        {
            while(true)
            {
                key = cin.get();
                file<<key<<endl;
                file.close();
            }
        }
        else continue;
    }

    return 0;

}

 

Proszę odpowiedź, co może robię źle. Z góry dziękuję smiley.

2 odpowiedzi

+2 głosów
odpowiedź 6 września 2016 przez plkpiotr Stary wyjadacz (12,420 p.)
wybrane 6 września 2016 przez Helmik
 
Najlepsza

Uwagi co do Twojego programu:

  • Jeżeli działasz na zmiennych wejścia/wyjścia fstream to musisz wskazać odpowiedni tryb otwarcia pliku tzn. do czego będzie on przeznaczony - wczytywania danych z pliku do programu, czy wypisywania z programu do pliku, jeżeli działasz na jednym pliku (co wydaje mi się dosyć dziwne) to powinieneś udostępnić wejście i wyjście oddzielając je pionową kreską:
    plik.open( "nazwa_pliku.txt", ios::in | ios::out );
  • Zauważ, że zamykasz sobie uchwyt do pliku w pętli po pobraniu znaku. Wniosek: zamknij "plik" po wyjściu z pętli.

  • Być może taki miałeś zamiar, ale twój pomysł nie odczytuje z pliku, a jedynie ze strumienia w konsoli, więc nie wiem, czy cin jest tutaj potrzebny.

Spójrz na moje rozwiązanie :) Jeżeli wracasz do podstaw, to stwórz sobie uchwyt do wejścia i wyjścia, w ten sposób będziesz wiedział z którego pliku odczytujesz dane, a do którego będziesz je wrzucał. Poniższy program będzie wczytywał kolejne linijki tekstu, możesz oczywiście wczytywać pojedyncze typy tak jak u Ciebie (char) lub np. int jednak wtedy dobrze wiedzieć ile takich danych jest...
 

#include <fstream>
#include <iostream>

using namespace std;

int main() {
    ifstream wejscie;
    ofstream wyjscie;
    wejscie.open("wejscie.txt");
    wyjscie.open("wyjscie.txt");
    // możesz sprawdzić, czy otwarto poprawnie metodą good()
    string linijka;
    // teraz będziemy czytać do końca pliku kolejne linijki i zapisywać je w drugim
    while(!wejscie.eof()) {
        getline(wejscie,linijka);
        wyjscie << linijka << endl;
    }
    // przydałoby się zamknąć metodą close() oba pliki - poza pętlą
    return 0;
}

Więcej informacji o obsłudze plików w takiej pigułce znajdziesz tutaj:

http://cpp0x.pl/kursy/Kurs-C++/Obsluga-plikow/305

Powodzenia i pozdrawiam ; )

 

1
komentarz 6 września 2016 przez Helmik Użytkownik (680 p.)
Wielkie dzięki, ale nie do końca o to mi chodziło. Ja chciałbym, żeby zawartość pliku zapisywała się po naciśnięciu każdego klawisza. Specjalnie umieściłem metody open() i close() w środku pętli, po prostu myślałem, że przy każdej iteracji, plik zostanie w ten sposób zapisany. Mógłbyś mi dopisać jak to zrobić?
komentarz 6 września 2016 przez plkpiotr Stary wyjadacz (12,420 p.)
Nie ma sprawy, cieszę się, że mogłem choć troszkę pomóc...
Jeżeli tylko będę potrafił to dopiszę :)
Za chwilę zarzucę kod, daj za jakiś czas znać, czy oto Ci chodziło ;)
komentarz 6 września 2016 przez plkpiotr Stary wyjadacz (12,420 p.)
edycja 6 września 2016 przez plkpiotr

Czy teraz się zrozumieliśmy?
Jeśli nie to śmiało pisz.

#include <fstream>
#include <iostream>

using namespace std;

int main() {
    ofstream wyjscie;
    wyjscie.open("wyjscie.txt");
    // poprawność strumienia good()
    char znak;
    while(znak != '*') {
        cout << "Podaj znak, ktory chcesz zapisac w pliku, potwierdzajac enterem: ";
        cin >> znak;
        if (znak == '*') {
            wyjscie.close();
            return 0;
        }
        wyjscie << znak << endl;
    }
}

Program zapisze linijka pod linijką kolejne znaki dopóki nie wpiszesz znaku gwiazdki *

1
komentarz 6 września 2016 przez Helmik Użytkownik (680 p.)

Dzięki! Wszystko super! Pozdrawiam smiley.

 

komentarz 6 września 2016 przez plkpiotr Stary wyjadacz (12,420 p.)
Miłego kodowania w takim razie ;)
+1 głos
odpowiedź 6 września 2016 przez niezalogowany


#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    fstream file;
    file.open("plik.txt", ios::out);
    char key;

    while(true)
    {

        if(file.good()==true)
        {
            while(true)
            {
                key = cin.get();
                file<<key<<endl;

            }
        }
        else continue;
    }

    file.close();

    return 0;

}

Tak powinien wyglądać cały kod by program działał poprawnie.

komentarz 6 września 2016 przez Helmik Użytkownik (680 p.)

Dziękuję za odpowiedź

smiley

Podobne pytania

0 głosów
2 odpowiedzi 384 wizyt
0 głosów
2 odpowiedzi 888 wizyt
pytanie zadane 2 sierpnia 2018 w C i C++ przez wihajster Początkujący (460 p.)
0 głosów
0 odpowiedzi 177 wizyt

92,549 zapytań

141,392 odpowiedzi

319,516 komentarzy

61,933 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...