Pliki - zapis/odczyt

0

Witam. Musze zrobic projekt na uczelnie wiec zaczalem sie bawic w c++, jednak nie moge uporac sie z jednym problemem...

system("cls"); 
    cout << "Podaj sciezke pliku wej, sciezke pliku wyj i nr operacji oddzielone spacjami:" << endl; 
    cin >> sciezwej >> sciezwyj >> nrint; 
    ifstream plik; 
    ofstream plik2; 
    plik.open(sciezwej.data(), std::ios::in); 
    plik2.open(sciezwyj.data()); 
    
    while ((sciezwej==sciezwyj) || ((nrint!=1) && (nrint!=2)) || (!plik.is_open()) || (!plik2.is_open())) 
    { 
        plik.close(); // jak te 2 sa wlaczone to w ogole przestaje dzialac po bledzie 
        plik2.close(); // a bez nich nie przeladowuje pliku po zmianie sciezki... 
        cout << "Sciezki we/wy sa takie same, nr operacji bledny lub nie idzie otworzyc pliku." << endl; 
        cout << "" << endl; 
        system("PAUSE"); 
        system("cls"); 
        cout << "Podaj sciezke pliku wej, sciezke pliku wyj i nr operacji oddzielone spacjami:" << endl; 
        cin >> sciezwej >> sciezwyj >> nrint; 
        ifstream plik; 
        ofstream plik2; 
        plik.open(sciezwej.data(), std::ios::in); 
        plik2.open(sciezwyj.data()); 
    }

Co jest - wszystko dziala jesli wpisze dobre sciezki ktore nie sa takie same i dobry nr operacji (1 lub 2), jesli wpisze takie same ale dobre sciezki albo zly nr operacji to wywala blad i kaze podac jeszcze raz. Jesli zrobie blad w ktorej ze sciezek to albo program sie zacina albo wywala blad i mimo podania innej sciezki nadal wywala ten sam blad.
Jakies sugestie?

0

E, użyj stringowej metody c_str() zamiast data().

0
ifstream plik;
ofstream plik2; 
do
{
    do
    {
        cout << "Podaj sciezke pliku wej, sciezke pliku wyj i nr operacji oddzielone spacjami:" << endl;
        cin >> sciezwej >> sciezwyj >> nrint;
        if(sciezwej == sciezwyj)
        {
            cout << "ścieżki pliku wej i wyj muszą być różne!" <<endl;
            continue; // pętla od początku
        }
        if( nrint==1 || nrint==2 )
        {
            cout "zły numer operacji!"<< endl;
            continue; // pętla od początku
        }
        break; // dane początkowe ok przerwij pętle
    }
    while(true);

    plik.open(sciezwej.c_str(), std::ios::in);
    if(!plik.good()) 
    {
        cout << "problemy z otwarciem pliku wejściowego: " << sciezwej << endl;
        plik.clear(); // wyczyść błędy
        continue;
    }

    plik2.open(sciezwyj.c_str());
    if(!plik.good()) 
    {
        cout << "problemy z otwarciem pliku wyjściowego: "<< sciezwyj << endl;
        plik2.clear(); // wyczyść błędy
        plik.close();
        continue;
    }
    break; // pliki otwarte poprawnie
}
while(true); // otwieranie plików
   
....
0

@MarekR22 - cos sie program gubi z tym kodem - caly czas wyrzuca podaj sciezke, podaj sciezke mimo ze wpisalem dobrze... Dalem if( nrint!=1 || nrint!=2 ) zamiast "==" bo mialy byc rozne ale teraz po wpisaniu dobrze program sie zapetla.

ah, i jesli plik2 nie istnieje program ma go sam stworzyc.

0

sorry strzeliłem byka w warunku na numer operacji ;|, można to poprawić tak:

        if( nrint==1 || nrint==2 )
            break; // dane początkowe ok przerwij pętle
        cout "zły numer operacji!"<< endl; // pętla od początku;
0

bledy chodza ok, jak wpisze poprawnie to tak jak mowilem nic sie nie dzieje i program wraca na poczatek jednak jesli wpisze 2 raz to samo to wtedy dziala. Jak zrobic zeby poszlo juz za 1 razem? =p

0

debugger w rękę i wykonać krok po kroku, moim zdaniem teraz jest ok (chyba, że źle zastosowałeś poprawkę do kodu).

0

Faktycznie to byl moj blad =p dzieki wielkie za pomoc =]

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