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

zad 34.1 Wczytanie liczb z pliku z pominięciem innych znaków

Ostatnio zmodyfikowano 2016-08-30 11:53
Autor Wiadomość
OddajcieBoja
Temat założony przez niniejszego użytkownika
zad 34.1 Wczytanie liczb z pliku z pominięciem innych znaków
» 2016-08-29 20:25:12
Witam.
Mój program zatrzymuje się na pierwszym napotkanym nieprawidłowym znaku. Od ponad godziny próbuję to naprawić, jednak bez skutku. Co zrobić, aby program działał prawidłowo?
C/C++
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
bool wczytaniepliku( string nazwa )
{
    ifstream plik;
    plik.open( nazwa.c_str() );
    if( !plik.good() )
         return false;
   
    while( !plik.eof() )
    {
        plik.clear();
        int liczba;
        plik >> liczba;
        if( plik.fail() )
             continue;
       
        cout << liczba << ", ";
    }
    plik.close();
    return true;
}


int main()
{
    if( !wczytaniepliku( "plik.txt" ) )
         cout << "nie dalo rady wczytac pliku :/" << endl;
   
    return 0;
}
P-151235
karambaHZP
» 2016-08-29 20:37:57
Wczytując operatorem >> dane niezgodne z typem zmiennej, strumień łapie błąd
i uniemożliwia dalsze działania. Czyść strumień po błędnych danych.
P-151237
OddajcieBoja
Temat założony przez niniejszego użytkownika
» 2016-08-29 23:09:01
Mam napisaną metodę ifstream::clear() na początku pętli, jak inaczej mam czyścić strumień? Przeglądam poprzednie rozdziały i nie widzę nic co mogło by pomóc.
P-151242
carlosmay
» 2016-08-29 23:37:18
Mam napisaną metodę ifstream::clear() na początku pętli
To tylko wyzerowanie flag, a jeszcze należy pozbyć się błędnych danych, z którymi nie radzi sobie operator
>>
.
Jeśli nie usuniesz źródła błędu, w każdym obrocie pętli trafiasz na te same błędne dane (zapętlenie).

Pokaż jak wygląda plik, a dopasujemy rozwiązanie.
P-151243
OddajcieBoja
Temat założony przez niniejszego użytkownika
» 2016-08-30 10:32:25
Dane w pliku wyglądają następująco:
32 2 knnfa 1 fda 423nn2 99 {}23 4


W sumie teraz zastanawiam się, czy mam napisać program tak, aby sam wykrył niechciane znaki, czy mam go po prostu ustawić specyficznie pod wybrany plik?
P-151247
carlosmay
» 2016-08-30 10:51:30
C/C++
{
    ifstream fin( nazwa_pliku );
    if( fin.is_open() ) {
        int number;
        do {
            if( fin >> number ) {
                cout << number << ' '; // wypisz jeśli wczytano liczbę
            }
            else {
                fin.clear();
                fin.get(); // pobierz jeden znak, który spowodował błąd
            }
        } while( !fin.eof() );
       
    }
    else {
        cerr << "Lipa:\n";
    }
}


plik.open( nazwa.c_str() );
Nie musisz konwertować stringa na cstringa od c++11.
P-151248
OddajcieBoja
Temat założony przez niniejszego użytkownika
» 2016-08-30 11:53:21
Dzięki za pomoc, program w końcu działa prawidłowo :)
P-151250
« 1 »
  Strona 1 z 1