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

Dzielenie tekstu na wyrazy

Ostatnio zmodyfikowano 2015-07-24 21:36
Autor Wiadomość
bamboo
Temat założony przez niniejszego użytkownika
Dzielenie tekstu na wyrazy
» 2015-07-21 15:50:13
Cześć,
mam za zadanie napisać program, który wczyta z pliku listę parametrów i jeden po drugim zapisze w kontenerze vector. Wszystko jest okej, jednak jest jeden mały ale uciążliwy problem, mianowicie program nie wczystuje wszystkiego.
C/C++
#include <iostream>
#include <fstream>
#include <conio.h>
#include <vector>

using namespace std;

ifstream plik;
string wiersz;
int klawisz;
string strPolecenie;

vector < string > vecNapisy;

void vLoadFile()
{
    plik.open( "folder/file.txt" );
    if( !plik.good() )
    {
        cout << "Plik nie został otwaty" << endl;
    }
    if( plik.eof() )
    {
        cout << "Plik jest pusty" << endl;
    }
}

void Polecenia( string strNapis )
{
    string slowo, litera;
    int dlugosc = strNapis.length();
    for( int i = 0; i < dlugosc + 1; i++ )
    {
        string litera( strNapis, i, 1 );
        if( litera != " " && litera != "\t" && litera != "\n" && litera != "\v" && litera != "\f" && litera != "\r" )
        {
           
            slowo += litera;
           
        }
        else
        {
            vecNapisy.push_back( slowo );
            slowo = "";
        }
    }
}

int main()
{
    vLoadFile();
    int ilinie = - 1;
    do
    {
        getline( plik, strPolecenie );
        cout << strPolecenie << "  " << strPolecenie.length() << endl;
        Polecenia( strPolecenie );
        ilinie++;
       
    } while( !plik.eof() );
   
    for( int i = 0; i < vecNapisy.size(); i++ )
    {
        cout << vecNapisy[ i ] << endl;
    }
    cout << vecNapisy.size() << "/" << ilinie << "=" << vecNapisy.size() / ilinie << endl;
   
    return 0;
   
}
folder/file.txt

BL 380 314 145
BP 380 314 145
CK 537 70 242
FT1 567 302 112
FT2 567 302 186
PC 1576 328 178
PPIO1 361 314 145
PPIO2 361 314 145
PS 450 341 121
WD 1600 380 121
WG 1600 400 178

Na wyjściu brak jest ostatniej kolumny, nie wiem gdzie zrobiłem błąd więc proszę Was o pomoc. Z góry dzięki
P-135018
pekfos
» 2015-07-21 16:21:34
C/C++
void Polecenia( string strNapis )
{
    string slowo, litera;
    int dlugosc = strNapis.length();
    for( int i = 0; i < dlugosc + 1; i++ )
    {
        string litera( strNapis, i, 1 );
        if( litera != " " && litera != "\t" && litera != "\n" && litera != "\v" && litera != "\f" && litera != "\r" )
        {
           
            slowo += litera;
           
        }
        else
        {
            vecNapisy.push_back( slowo );
            slowo = "";
        }
    }
}
Nie używasz zmiennej litera zadeklarowanej na początku. Niepotrzebnie tworzysz też stringa, skoro porównujesz wyłącznie pojedyncze znaki. Zrób char litera = strNapis[i];, porównuj ze stałymi znakowymi, a nie łańcuchami i dodaj przypadek, gdy znak jest równy '\0'. Iterujesz po całym c-stringu, ale zabrakło ci wykrywania jego końca. W zasadzie wszystkie te przypadki możesz uchwycić wywołaniem isgraph(litera) z <cctype>, to znacząco uprości ten kod.

Poza tym, ten plik wydaje się mieć dość prosty format słowa i 3 liczb oddzielonych spacjami w każdej linii. Czemu nie wczytasz tego operatorem >>? Od razu będziesz mieć dobre typy, co ułatwi przetwarzanie, a do wektora wrzucisz obiekty odpowiednio zdefiniowanej struktury.
P-135025
bamboo
Temat założony przez niniejszego użytkownika
» 2015-07-24 21:36:43
Wszystko działa, dzięki za pomoc ;)
P-135176
« 1 »
  Strona 1 z 1