Cześć,
wymyśliłem sobie funkcję w programie, dzięki której będzie można edytować wprowadzonego pracownika. Całość opiera się na dynamicznie zaalokowaniej strukturze danych. Pesel jest swego rodzaju ID - po nim rozpoznaję użytkownika i przechodzę do następnych pól. Ogólnie jakoś to działa :)
Problem jest właśnie ze zmienianiem danej wartości... Jeśli otworzę plik w trybie 'out' to jak się domyślacie - nowe wpisy zastępują mi cały plik a nie tylko wybraną linię. Jeśli z kolei otworzę dodatkowo w trybie 'app' - również niespodzianki nie ma - wszystko dopisuje się na końcu.
Czy jest jakiś sposób żeby zastąpić linię tekstu (string) innym wprowadzonym stringiem?
Kod całej funkcji:
void edytuj ()
{
cout << "Podaj nr PESEL pracownika, ktorego dane chcesz edytowac: " << endl;
string pesel_tmp;
cin >> pesel_tmp;
cout << endl;
fstream plik;
plik.open("pracownicy.txt", ios::in);
if (plik.good()==false)
{
cout << "Blad! Plik nie istnieje!" << endl;
exit(0);
}
string linia;
bool flag=0;
int nr_linii=1;
while (getline(plik, linia))
{
//if(nr_linii%1 == 0 && nr_linii!=0)
if(nr_linii!=0)
{
if (linia == pesel_tmp)
{
flag=1;
break;
}
}
nr_linii++;
}
//cout << "Flaga: "<< flag << endl << endl;
if (flag==1)
{
cout << "Ponizej dane pracownika o numerze PESEL: " << linia << endl;
}
if (flag==0)
cout << "Nie znaleziono pracownika o numerze PESEL: " << pesel_tmp << endl;
string imie_buf, nazwisko_buf, stanowisko_buf, stawka_buf;
int aktualny_nr=nr_linii; //tu chyba mozna sie usmiechnac :)
while (getline(plik, linia))
{
if (aktualny_nr==nr_linii) imie_buf = linia;
if (aktualny_nr==nr_linii+1) nazwisko_buf = linia;
if (aktualny_nr==nr_linii+2) stanowisko_buf = linia;
if (aktualny_nr==nr_linii+3) stawka_buf = linia;
++aktualny_nr;
}
if (flag==1)
{
cout << "1. Imie: " << imie_buf << endl;
cout << "2 Nazwisko: " << nazwisko_buf << endl;
cout << "3. Stanowsko: " << stanowisko_buf << endl;
cout << "4. Stawka godzinowa brutto (w PLN): " << stawka_buf << endl;
int licz;
bool flaga=1;
plik.close();
fstream plik;
plik.open("pracownicy.txt", ios::out | ios::app); //do zapisu
for (licz=1; flaga==1; licz++)
{
cin.ignore();
cout << endl << "Podaj numer pozycji, ktora chcesz edytowac: ";
int pozycja;
cin >> pozycja;
cin.ignore();
if (pozycja==1)
{
cout << "Podaj nowa wartosc dla pola Imie: ";
getline (cin, wsk -> imie);
plik << (wsk -> imie) << endl;
}
if (pozycja==2)
{
cout << "Podaj nowa wartosc dla pola Nazwisko: ";
getline (cin, wsk -> nazwisko);
plik << (wsk -> nazwisko) << endl;
}
if (pozycja==3)
{
cout << "Podaj nowa wartosc dla pola Stanowisko: ";
getline (cin, wsk -> stanowisko);
plik << (wsk -> stanowisko) << endl;
}
if (pozycja==4)
{
cout << "Podaj nowa wartosc dla pola Stawka: ";
getline (cin, wsk -> stawka);
plik << (wsk -> stawka) << endl;
}
HANDLE uchwyt;
uchwyt = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(uchwyt, FOREGROUND_RED | FOREGROUND_INTENSITY );
cout << endl << "Jesli chcesz edytowac kolejne pole nacisnij T a nastepnie ENTER." << endl;
cout << "Aby zakonczyc nacisnij N a nastepnie ENTER." << endl;
cout << "Wybor: ";
SetConsoleTextAttribute(uchwyt, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY );
char decyzja;
cin >> decyzja;
cout << endl;
if ((decyzja == 'T') || (decyzja == 't'))
flaga=1;
else
{
cout << "Dziekujemy. Zmieniono " << licz << " pola." << endl;
flaga=0;
}
}
}
if (flag==0)
cout << endl << "Upewnij sie, ze wpisales prawidlowy numer." << endl;
plik.close();
HANDLE uchwyt;
uchwyt = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(uchwyt, FOREGROUND_RED | FOREGROUND_INTENSITY );
cout << endl << "Aby powrocic do menu nacisnij dowolny klawisz...";
SetConsoleTextAttribute(uchwyt, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY );
getch();
}
Z góry dziękuję za wszelkie pomysły :)