Find_first_not_of odczyt

Find_first_not_of odczyt
Patryk Wielgosz
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:68
0

Cześć , zrobiłem programik, który z pliku do odczytu sprawdza dana linijke, czy jest w niej cos innego niz spacja lub cyfra i jesli tak, to pokazuje blad danej linijki w konkretnej pozycji , wszystko dziala, ale tylko dla liter np. jesli w 3 linijce jest" 0 2 3 445 a 23" to napisze blad w linijce 3 na pozycji 10
natomiast jesli w linijce 3 jest jakis inny znak niz litery np. "012 7823 54# 90" to program pisze, iz zapis jest poprawny, nie uwzglednia innych znaków od liter, czy można to jakoś zmienić ?

Kopiuj
#include<iostream>
#include<string>
#include<math.h>
#include<fstream>
#include<cstdlib>

using namespace std;


int main()
{   size_t kontroluj=0;
    size_t t=-1;
    string slowo;
    string line;
    ifstream plik;
    plik.open("lulu.txt");

    while(!plik.eof())
    {   kontroluj ++;
        getline(plik,slowo);
        line=slowo;
        if((t=line.find_first_not_of(" 0123456789",t+1)) != string::npos)  // uwaga, czyta tez spacje
        {

            cout<<"Blad w linijce "<<kontroluj;
             cout<< " literka w pozycji "<<t<<"\n";
        }
        else
        {
            cout<<"Poprawny zapis w linijce "<<kontroluj<<"\n";
        }

    }
    plik.clear();
    plik.seekg(0);
}

YooSy
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 5 lat
  • Postów:472
1

Robisz jakiś inny błąd, bo ten kod powinien działać poprawnie.
https://wandbox.org/permlink/BliqjIBXk5T5uZRh


Nie pisz na priv. Zadaj dobre pytanie na forum.
au7h
  • Rejestracja:ponad 11 lat
  • Ostatnio:około rok
  • Postów:215
0

Dopisz tam np. na początku pętli while coś tego typu

Kopiuj
        if(plik.peek() == EOF)
            break;

bo jeżeli tego nie ma, to dla 4 linijek tekstu w lulu.txt getline wczyta 5
777.png

  • 777.png (7 KB) - ściągnięć: 103
edytowany 2x, ostatnio: au7h
Patryk Wielgosz
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:68
0
au7h napisał(a):

hmm.. a u mnie bez tej linijki kodu dla 4 lini wyświetlą się 4 line

edytowany 1x, ostatnio: Patryk Wielgosz
YooSy
Bo plik kończy się na tej linii. Gdy zakończenie będzie enterem to doczyta jeszcze jedną.
au7h
nawet bez jawnego zakończenia '\n' w linuxowym KWrite wczyta 5 linii :P może dlatego, że w windowsach koniec linii to CR+LF a w unixopodobnych samo LF
Patryk Wielgosz
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:68
0
YooSy napisał(a):

Robisz jakiś inny błąd, bo ten kod powinien działać poprawnie.
https://wandbox.org/permlink/BliqjIBXk5T5uZRh

hmm.. nwm Odpalam program w code blocks, i źle wyświetla, na zmiane na literki w pliku tekstowym reaguje, natomiast na inne znaki *%$#! itp. nie reaguje

YooSy
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 5 lat
  • Postów:472
0

To są znaki inne niż zawarte w stringu poszukiwanych znaków, więc nie powinno ich zaliczać do cyfr, które w nim są.


Nie pisz na priv. Zadaj dobre pytanie na forum.
TomaszLiMoon
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 12 godzin
  • Postów:530
0

Spróbuj użyć:

Kopiuj
#include <iostream>
#include <string>
#include <math.h>
#include <fstream>
#include <algorithm>
#include <ctype.h>
#include <stdio.h>

using namespace std;

int main()
{
    ifstream file("file.txt");
    string line {};

    while( getline( file , line ) )
    {
        auto iter = find_if( line.begin() , line.end(), []( char sign ){ return !(isdigit(sign)||isspace(sign)); } );
        cout << "Processing line : " << line ;
        if( iter != line.end() ) cout << " : error find at position : " << distance( line.begin(), iter ) << endl;
        else cout << " : correct" << endl;
    }

    return 0;
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.