Nie można odczytac kilku lini z pliku

0

Witam, znowu mam mały problem z programem do szyfrowania. CHodzi konkretnie o ten fragment:

void odczyt_cezar(){
    fstream plik;
    plik.open("wizytowka.txt",ios::in);
    if(plik.good()==false)
       {
        cout<<"Plik nie wczytany"<<endl;
        exit(0);
       }
int klucz;
cout<<"podaj wspolczynnik przesuniecia"<<endl;
cin >> klucz;
string tekst;

int nr_lini = 1;
while(getline(plik,tekst))
{

   cout<<tekst<<endl;
    nr_lini++;
}plik.close();
int dlugosc=tekst.length();
for(int i=0;i<=dlugosc ;i++){
    if(tekst[i]>=65 && tekst[i]<=90) tekst[i]=(tekst[i]-65+klucz)%26+65;
    else if(tekst[i]>=97 && tekst[i]<=122) tekst[i]=(tekst[i]-97+klucz)%26+97;
}

 cout << tekst<<endl;
 plik.open("wiytowka_1.txt",ios::out);
 plik<<tekst<<endl;
 plik.close(); 

Konkretnie chodzi o to, że przed wprowadzeniem tekstu do "wizytowka.txt, musze usuwac wszystkie wiersze, tak żeby został 1. Wiem, że odpowiedzialne jest za to 'getline', ale chcialbym by ten program, nawet przy wielu wierszach szyfrowal mi te dane za pomocą pętli for. Za jakim trikiem powinienem się rozejrzeć?

0

chcesz czytać i pisać do tego samego pliku? to ryzykowne, lepiej otwórz drugi plik a po operacji usuń wejściowy i zmień nazwę nowego.

0

Nie. Otwieram plik "wizytowka", a zapisuje w wizytowka_1.

1
  1. Formatowanie kodu jest istotne.
  2. getline nie dopisuje zawartości do zmiennej tekst tylko ją zastępuje.

Tu wczytujesz linie z pliku, ale po wyjściu z pętli w zmiennej tekst znajduje się tylko ostatnio wczytana linia.

string tekst;
int nr_lini = 1;

while (getline(plik, tekst)) {
    cout << tekst << endl;
    nr_lini++;
}
plik.close();

int dlugosc = tekst.length();
for (int i = 0; i <= dlugosc; i++) {
    if (tekst[i] >= 65 && tekst[i] <= 90)
        tekst[i] = (tekst[i] - 65 + klucz) % 26 + 65;
    else if (tekst[i] >= 97 && tekst[i] <= 122)
        tekst[i] = (tekst[i] - 97 + klucz) % 26 + 97;
}
 

3 .Nie będę wnikał, dlaczego chcesz koniecznie użyć pętli for, ale proszę:

for (int nr_linii = 1; getline(plik, tekst); i++) {
    cout << tekst << endl;
}
1
lamaczyk napisał(a):

Za jakim trikiem powinienem się rozejrzeć?

żadnym. Wszystko, co trzeba już napisałeś.

Problem jest jedynie z algorytmem w Twoim programie. Po prostu w złych miejscach wykonujesz pewne operacje. W pętli while czytasz kolejną linię/wiersz z pliku, a już poza nią ostatnią przeczytaną linię szyfrujesz i zapisujesz do pliku - to niedobrze. Jeśli przeniesiesz operacje szyfrowania do wnętrza pętli while i będziesz od razu zapisywał zaszyfrowaną linię do drugiego pliku to osiągniesz zamierzony cel.

0

Przepraszam, że tak późno odpisuje, ale bylem na studiach. Dziękuje wam serdecznie za okazaną pomoc. A adam.chyla nie kojarzysz takiej stronki, do której się wklejało swój kod, a ona wyrzucala poprawnie sformatowany kod?

0

O o o o! TO jest to EvilOne:). Naszukalem sie tego:) Dzięki Wielkie! Leci do szybkiego wybierania.

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