Z czego sklada sie string

0

Witam mam napisac program który sprawdza liczbe w tekscie i robi na niej jakies dzialanie.Na jedna linie przypada jedna liczba i napisalem na razie program ktory wczytuje liczbe i sprawdza czy sklada sie z cyfr wyszlo mi takie cos:Problem jest z tym,że jak dam w pliku jakies słowo to powinno wyjsc z=1 czyli powinno byc wypisane ze jest jakis blad.A wyskakuje mi ciagle z=0

void odczytpliku(string plik1)
{
ifstream plik;
string linia;
plik.open("plik1.txt",ios::in);
if(plik.good())
{
while(getline(plik,linia))
{
    int z=0;
    for( unsigned int i;i<linia.length();i++)
    {
        int kodascii;
        char kawalek;
        kawalek=linia.at(i);
        kodascii=int(kawalek);
        if( kodascii<=48&&kodascii>=57)
        {
             z=1;
        }
    }
   
if(z==1)
{
    cout<<"zle wprowadzona liczba";
}
}
}
else
    cout<<"nie udalo sie wczytac";
} 
0

Problem jest z tym,że jak dam w pliku jakies słowo to powinno wyjsc z=1 czyli powinno byc wypisane ze jest jakis blad.A wyskakuje mi ciagle z=0

0
 for( unsigned int i;i<linia.length();i++)

Problem w tym, że nie zerujesz i na początku. Ma on losową wartość pewnie większą niż długość słowa i nigdy nie wchodzisz do pętli.

To powinno załatwić sprawę

 for( unsigned int i = 0;i<linia.length();i++)

Poza tym robisz różne dziwne rzeczy :p
Całe to

int kodascii;
        char kawalek;
        kawalek=linia.at(i);
        kodascii=int(kawalek);
        if( kodascii<=48&&kodascii>=57)
        {
             z=1;
        }

mógłbyś zamienić tym

        if( !isdigit( linia[i] ) )
             z=1;
0
#include <fstream>
#include <iostream>
#include <cctype>
#include <algorithm>
#include <string>


int main()
{
    std::ifstream file("Read.txt");
    std::string str;
    while (std::getline(file, str))
    {
        /* 1 */
        if (std::string::npos != str.find_first_of("0123456789")) {
          std::cout << "digit(s)found!" << std::endl;
        } else {
          std::cout << "digit(s) not found!" << std::endl;
        }
        /* 2 */
        if (std::find_if(str.begin(), str.end(), (int(*)(int))std::isdigit) != str.end()){
            std::cout << "digit(s)found!" << std::endl;
          } else {
            std::cout << "digit(s) not found!" << std::endl;
          }
    }
}

Na dwa sposoby.

Gotowe funkcje sa po to zeby ich uzywac.

0

Działa,dziekuje za pomoc.

0
stryku napisał(a):

...mógłbyś zamienić tym

        if( !isdigit( linia[i] ) )
             z=1;

A może od razu, razem z pętlą:

bool good=(linie.length()>0); // bo jak wczytano pusty to i tak zła liczba
for(size_t i=0;(good)&&(i<linia.length());++i) good&=isdigit(linia[i]);

Czyli razem:

#include <iterator>
#include <iostream>
#include <iomanip>
#include <sstream>
#include <fstream>
#include <cctype>
using namespace std;

string readfile(const string &filename)
  {
   ifstream fin(filename.c_str());
   if(!fin) throw exception();
   stringstream sout;
   copy(istreambuf_iterator<char>(fin),istreambuf_iterator<char>(),ostreambuf_iterator<char>(sout));
   return sout.str();
  }
  
bool isnumber(const string &line)
  {
   bool good=(line.size()>0);
   for(char ch:line) if(!(good&=isdigit(ch))) break;
   return good;
  }
  
int main()
  {
   try
     {
      if(isnumber(readfile("num.txt"))) cout<<"dobrze wprowadzona liczba"<<endl;
      else cout<<"zle wprowadzona liczba"<<endl;
     }
   catch(...) { cout<<"nie udalo sie wczytac"<<endl; }
   return 0;
  }
0
  1. zamień && na || i nierówności na ostre
  2. popraw klamerki

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