C++ podczas zapisu do pliku txt ignoruje mi 1 znak

0

Witam!
Ostatnio napisałem program, który ma generować losowe ciągi znaków i dopisywać do czego on jest lecz podczas dopisywania ignoruje mi pierwszy wyraz(jak wstawie: a b to pisze tylko b, a jak wpisze cplusplus program program, to zapisze tylko program program)
legenda:
hash-ciag znakow,
znaczenie-dopisek do ciagu
dlhasla- dopisuje ile ma znakow ciag

	fstream plik;
	plik.open("haslo.txt", ios::out | ios::app);
    plik<<endl<<hash;
cout<<"\a";
cout<<"Dopisek do hasla: ";

cin>>znaczenie;
     getline(  cin, znaczenie );

    plik<<"   Liczba znakow: "<<dlhaslo;
    plik<<"   Haslo do: "<<znaczenie;
	plik.close();
system("pause");
cout<<"\a \a \a";
0

cin>>znaczenie; getline( cin, znaczenie );

cin najpierw pobiera wszystko do spacji, a nastepnie getline pobiera reszte do przelamania linii. Wystarczy samo getline( cin, znaczenie ); i wszystko powinno działać.

0

Niestety nie działa. Program teraz wyświetla tylko: "Dopisek do hasla:" i daje pause (która jest wywołana na dole). Jeżeli wcześniej nie wspomniałem, to chodzi mi wprowadzic z klawiatury dopisek do zmiennej: znaczenie i zapisać je po ciagu znaków.

0

Wraz ze spacjami ma być zmienna znaczenie oraz aby nie usuwało mi 1 wyrazu.

0

Mógłbyś wysłać kod i dokładnie wytłumaczyć co program powinien robić, bo niezbyt rozumiem? Wyraz usuwało ze względu, że cin zapisywal najpierw 1. wyraz w zmiennej a potem całą reszte getline pobierał i nadpisywał. Usuniecie cin powinno załatwić sprawę imo.

0
#include <iostream>
#include <windows.h>
#include <fstream>
#include <ctime>
#include <cstdlib>
using namespace std;

int dlhaslo;
string hash;
string znaczenie;
string space;
void menu()
{
	HANDLE  hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  
   SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN);
   
	cout<<"--------------Generator hasel--------------"<<endl;
	cout<<"-------------------------------------------"<<endl;
	cout<<"Czasami moga wystepowac niedozwolone znaki!"<<endl;
	cout<<"-------------------------------------------"<<endl;
	
}
//Generator hasel
	const char * genText(int max, bool potasuj = true) {
    /*
     *  Funkcja generuje losowy ciąg. 
     *   -argument max to długość wygenerowanego ciągu
     *   -argument potasuj aktywuje dodatkowe przemieszanie ciagu (domyslny argument)
    */
 
    //Cztery tablice z roznymi typami znakow. Mozna modyfikowac!

    char tab0[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    char tab1[] = "012345678911121314151617181920";

    //Tablica flag z uzytymi juz tablicami. Zapewnia rownomierny rozklad uzycia wszystkich tablic z znakami podobna ilosc razy)
    bool vistTab[] = {0, 0, 0, 0};
    //Zwracany ciag
    string buffor;
 
    srand(time(NULL));
 
    //Petla generowania znak po znaku
    for (int i = 1; i < max; i++) {
        //Sprawdz czy wszystkie 4 tablice juz uzyte byly, jesli tak to zezwol ponownie na wylosowanie wszystkich tablic
        if (vistTab[0] == true && vistTab[1] == true)
            vistTab[0] = vistTab[1] = false;
 
 
        //Sprawdz czy wylosowany typ tablicy nie byl juz wykorzystywany, jak byl to losuj inna
        int randTab;
        do {
            randTab = rand() % 2;
        } while (vistTab[randTab] == true);
        vistTab[randTab] = 1;
 
        int sizeTab = 0;
        int nr;
 
        //Zaleznie od wylosowanej powyzej tablicy ze znakami, losuje z niej znak i dopisuje go do buffora
        switch (randTab) {
            case 0:
                sizeTab = sizeof (tab0) / sizeof (tab1[0])-1;
                nr = rand() % sizeTab;
                buffor += tab0[nr];
                break;
 
            case 1:
                sizeTab = sizeof (tab1) / sizeof (tab1[0])-1;
                nr = rand() % sizeTab;
                buffor += tab1[nr];
                break;
 
            
        }
    }

    //------------------------------------------------
 
    return buffor.c_str();
}
//-------------------------------------------------------

int main()
{
	//nazwa okna
	SetConsoleTitleA( "Generator hasel" );
	//-------------------------------------
	
         menu();
         cout<<"Wprowadz dlugosc hasla: \a \a"<<endl;
         cin>>dlhaslo;
         system("cls");
         menu();
         
hash=genText(dlhaslo+1, true);
cout<<"\a";
cout<<hash<<endl;



system("cls");
menu();

string g;
	fstream plik;
	plik.open("haslo.txt", ios::out | ios::app);
    plik<<endl<<hash;

cout<<"Dopisek do hasla: ";
cin>>g;
     getline(  std::g, std::znaczenie );

    plik<<"   Liczba znakow: "<<dlhaslo;
  
    plik<<"   Haslo do: "<<znaczenie;
	plik.close();
cout<<"\a \a \a";
system("pause");
}

Najpierw trzeba podać dlugosc ciagu, następnie program generuje tyle znaków co się wpisało, teraz trzeba podać dopisek do ciągu(po wygenerowanym ciągu po 3 spacjach ma się pojawić dopisek wpisany na klawiaturze) i to wszystko powinno zapisać się w pliku .txt nst. 2A6V4Kb61LV22f8u1GI1x18 Liczba znakow: 23 Haslo do: gfgf
Tylko, że przy Hasło do: , usuwa pierwszy wyraz np. pro pro, zapisze tylko 1 raz pro.

0

cout<<"Dopisek do hasla: ";
getline(g,znaczenie );
plik<<" Liczba znakow: "<<dlhaslo;
plik<<" Haslo do: "<<znaczenie;
plik.close();
cout<<"\a \a \a";
system("pause");
}

tak jak pisałem wcześniej
cin pobiera dane do spacji, getline domyślnie do przełamania linii, chyba, że jako 3. argument poda się znak do którego ma pobierać

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