Zapisywanie wciskanych klawiszy do pliku.

0

Witam

Mam problem polegający na tym że gdy w pętli if nie wstawię while(1) to poprawnie zapisuje do pliku txt klikane klawisze ale na kazdy znak trzeba uruchamiac od nowa program i po kazdym znaku program sie zamyka.W czym problem?

#include <iostream>
#include <fstream>
#include <string>
#include <conio.h>

using namespace std;

int main()
{
home:
ofstream keys("C:/test.txt", ios::app);  
if(keys)    // Sprawdzamy czy plik został otwarty.
    {   
        cout << "Plik odtworzony pomyslnie." << endl;
        while(1)
        {
        string znak;
        znak = getch();
        keys << znak; // zapisujemy klawisz do pliku
        }
    }
else
    {
    cout << "BLAD: nie mozna otworzyc pliku." << endl;
    if(getch() == 27) goto home; //jesli klikniesz esc sprobojesz od nowa wczytac plik
    }
return 0;
}
0

Witam,

Program jest dość nieładnie napisany. Używanie etykiet w tak prostym programie jest niedobre.
Zresztą w ogóle używanie etykiet jest niedobre, bo to naleciałość jeszcze z czasów assemblera i C.

Tak to powinno wyglądać, jeżeli chcesz używać conio.h:


#include <iostream>
#include <fstream>
#include <conio.h>

int main()
{
    char znak;
    std::fstream plik("znaki.txt", std::ios::out | std::ios::app);

    if(plik.is_open()){
        do{
            znak = getch();
            plik << znak;
        }while(znak != 'k');
    }

    plik.close();
    system("PAUSE");
}

Pozdrawiam
Grzesiek

0

Po pierwsze to nie opisales co dokladnie nie dziala. Pewnie problem z buforem, sprobuj dodac cos w rodzaju endl w linijce "keys << znak". Nie wiem czy tak to sie robi, nie znam c++

0

Nadal nie działa.
Ale ja nie chce "endl" bo chce żeby wszystkie znaki były po kolei a nie każdy w osobnej linijce.
Nie działa chodzi o to że jak dodam tam while(1) to nie zapisuje mi nic do pliku.

0

Program się wiesza, bo kolega nie zastosował warunku opuszczenia pętli nieskończonej to po pierwsze :)
Po drugie nie ma potrzeby zapisywanie znaku do obiektu klasy std::string gdyż z powodzeniem mieści się on w obiekcie typu char.

To co napisałem w pierwszym zdaniu powodowało błędy.

PS: Wstawiłeś zapewne while(1), żeby chociaż raz pobrać znak. Też niedobrze, bo od tego jest pętla 'do while'.

3
#include <iostream>
#include <algorithm>
#include <fstream>
#include <iterator>
using namespace std;

int main() {
    // ofstream myAwesomeFile("/path/to/file");

    cin >> noskipws;

    copy
    (
        istream_iterator<char>(cin),
        istream_iterator<char>(),
        ostream_iterator<char>(cout)    // myAwesomeFile
    );

    return 0;
}

http://ideone.com/DufHfb

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