Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++][fstream] Nieudany odczyt danych z pliku za pomocą strumienia >>

Ostatnio zmodyfikowano 2014-05-16 21:41
Autor Wiadomość
pekfos
» 2014-05-16 20:55:51
C/C++
temp_wynik[ i ] = temp_znak;
Przekraczasz zakres.
P-110143
Caspinos
Temat założony przez niniejszego użytkownika
» 2014-05-16 20:57:26
Kod całego programu:
C/C++
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

bool deszyfruj( ifstream & tekst, ifstream & klucze, ofstream & wynik );
bool deszyfruj_plik( string plik_tekst, string plik_klucze, string plik_wynik );


int main()
{
    deszyfruj_plik( "sz.txt", "klucze2.txt", "wynik4b.txt" );
   
    return 0;
}


bool deszyfruj_plik( string plik_tekst, string plik_klucze, string plik_wynik )
{
    ifstream tekst;
    tekst.open( plik_tekst.c_str() );
   
    ifstream klucze;
    klucze.open( plik_klucze.c_str() );
   
    ofstream wynik;
    wynik.open( plik_wynik.c_str() );
   
    if( !tekst.good() || !klucze.good() || !wynik.good() )
    {
        cout << "Blad podczas wczytania ktoregos z plikow!" << endl;
        return false;
    }
   
    if( deszyfruj( tekst, klucze, wynik ) )
    {
        cout << "Deszyfracja zakonczona powodzeniem!" << endl;
        return true;
    } else
    {
        cout << "Deszyfracja zakonczona niepowodzeniem!" << endl;
        return false;
    }
}

bool deszyfruj( ifstream & tekst, ifstream & klucze, ofstream & wynik )
{
    string temp_wyraz;
    string temp_klucz;
    string temp_wynik;
    int temp_znak;
   
    while( tekst >> temp_wyraz && klucze >> temp_klucz ) // niepoprawnie działająca pętla
    {
        int j = 0;
        for( int i = 0; temp_wyraz[ i ] != '\0'; i++ )
        {
            j++;
            if( temp_klucz[ j ] == '\0' )
                 j = 0;
           
            temp_znak =( int ) temp_wyraz[ i ] +(( int ) temp_klucz[ j ] - 64 );
            if( temp_znak > 90 )
                 temp_znak -= 26;
           
            temp_wynik[ i ] = temp_znak;
        }
        cout << "d: " << temp_wynik << endl; // niewłaściwie wyświetlające się dane
    }
   
    if( tekst.eof() || klucze.eof() )
         return true;
    else
         return false;
   
}

Fragment danych wejściowych w pliku sz.txt

QGM
ITKK
ULJ
QEG
ZFXG
XAX
HWJE
EMKD
MACPJ
DOW
AVDKAHAUFAC
QPUBRYGIINPHZP
OXBSAEAJDMN
ANHSPZYQF

Fragment danych wejściowych w pliku klucze2.txt

FRS
SKFR
RWQ
CVD
LKDF
VFD
VBTD
ERUC
BDTOP
AJK
PGPNV
QOT
DIP
KECAS
XWCEZ
IYR

Tak jak wspomniałem wcześniej program wykonuje pętlę while w funkcji deszyfruj kilkadziesiąt razy, po czym się zawiesza.
Przy każdym wywołaniu pętli program wypisuje "d: " ale zmienna temp_wynik albo jest pusta (albo się nie wyświetla).
P-110144
Monika90
» 2014-05-16 21:32:57
Pekfos ci napisał co jest źle. String temp_wynik jest pusty, zatem temp_wynik[i] to odwoływanie się poza zakresem. Możesz dodawać znaki na końcu stringa za pomocą temp_wynik.push_back(temp_znak); tylko przenieś deklarację temp_wynik tuż przed pętlę for.
P-110156
Caspinos
Temat założony przez niniejszego użytkownika
» 2014-05-16 21:41:27

Pekfos ci napisał co jest źle.
Racja, dopiero teraz zaskoczyłem o co chodzi.
Wszystkim zaangażowanym serdeczne dziękuję za pomoc.
P-110159
1 « 2 »
Poprzednia strona Strona 2 z 2