problem z zamianą stringa na int

0

Witam

mam problem z napisaniem kodu w C++

wczytuję z pliku stringa napis

ten napis to 2+2

chce zamienić ten napis na int tak żebym mógł wykonać działanie 2+2

wrzucam kawałek kodu gdzie próbuje zamienić stringa na int

string napis;
string liczba;
int rozwiazanie;
int suma;
liczba = napis;
rozwiazanie = atoi(liczba.c_str());

    suma = rozwiazanie + 6;
    cout << liczba <<" + 6 =  " << suma<< endl;

zamiana działa ale tylko na ciągu liczb jak pojawia się znak np + uciną na liczbie przed nim

ktoś ma pomysł jak zamienić całość na int tak, żeby można wyliczyć wczytany plik?

0

Tak chodzi mi o to, żeby w pliku txt w którym mam równania matematyczne pobrać je za pomocą stringa a następnie wyliczyć i zapisać wynik w drugim pliku txt. Próbowałem to za pomocą atoi.

0

to co napisałeś jest nie możliwe(nie w taki sposób).
Pobierasz stringa, rozbijasz go sobie i robisz działania(to tak najbardziej prymitywnie dla tego przykładu). Ale lepiej poszukaj sobie rozwiązań na necie nie ty pierwszy wpadasz na pomysł kalkulatora. Sporo przykładów jest, prześledź.

0

Zamiast wczytywać napis wczytuj (kolejno) int, char, int -- wtedy te dwa inty zsumujesz -- albo sprawdzisz, jaki wszedł char i wykonasz inne działanie. Trzeba tu trochę na piechotę pokodować...

1

A jak musisz wczytywać z jakichś powodów stringa, to może trzeba zatrudnić do tego stringstream -- http://www.cplusplus.com/reference/sstream/stringstream/

0

Czy chcesz zrobić tylko dodawanie, czy inne operacje też?
Jeśli więcej niż dodawanie, to najlepszym sposobem byłoby utworzenie klasy i tam zabawa z operatorami.

Co do samego wczytywanie znaków, stringstream jest najlepszym wyborem.

0

Inne operacje też ogólnie program ma polegać na tym że ma wczytywać z pliku różne działania matematyczne a program ma je liczyć i zapisywać wynik do innego pliku. Na razie program działa mi tak że wczytuję widać do wczytać mogę zapisać to samo a nie umiem zrobić żeby program to wyliczał.

0

Inne operacje też ogólnie program ma polegać na tym że ma wczytywać z pliku różne działania matematyczne a program ma je liczyć i zapisywać wynik do innego pliku. Na razie program działa mi tak że wczytuję widać do wczytać mogę zapisać to samo a nie umiem zrobić żeby program to wyliczał.

1

Polecam Ci wykonać obiektowo. Zrobić sobie jakąś klase:

Działanie, w tej klasie jako pole stworzyć sobie stringstream, które będzie np. tej Twoj "2+2".
Zczytywać znak matematyczny: "+" i wtedy za pomocą przeciążenia operatorów odpowiednio dobierać jakie działanie ma zostać wykonane.

Tutaj masz prosty i mało skomplikowany kod, jak mniej więcej działa ten stringstream, ale i tak zachęcam do przeczytanie dokumentacji;

#include <sstream>
#include <iostream>

using namespace std;

int main(){

    stringstream ss;
    ss.str("2+2");
    int Number;
    char ch;

    ss >> Number;
    cout << Number;
    ss>>ch;
    cout << ch;
    ss >> Number;
    cout << Number;
}

Edit:
Jeżeli chodzi o zczytywanie z pliku to polecam "getline", jeżeli wczytasz się w dokumentacje to "getline" jako argument może przyjąć znak do jakie ma zczytywać.
Czyli, jeżli w pliku działania masz rozdzielone spacjami, to jako argument dajesz "spacje" , jeżli są rozdzielone "enterem" to nic nie dajesz bo "getline" domyślnie zczytuje do końca lini "\n".

1

Znalazłem takiego gotowca z boost i nieco go przerobiłem:

/*=============================================================================
    Copyright (c) 2002-2010 Joel de Guzman

    Distributed under the Boost Software License, Version 1.0. (See accompanying
    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
=============================================================================*/
///////////////////////////////////////////////////////////////////////////////
//
//  A parser for summing a comma-separated list of numbers using phoenix.
//
//  [ JDG June 28, 2002 ]   spirit1
//  [ JDG March 24, 2007 ]  spirit2
//
///////////////////////////////////////////////////////////////////////////////

#include <boost/config/warning_disable.hpp>
//[tutorial_adder_includes
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <iostream>
#include <string>
//]

namespace client
{
    //[tutorial_adder_using
    namespace qi = boost::spirit::qi;
    namespace ascii = boost::spirit::ascii;
    namespace phoenix = boost::phoenix;

    using qi::double_;
    using qi::_1;
    using ascii::space;
    using phoenix::ref;
    //]

    ///////////////////////////////////////////////////////////////////////////
    //  Our adder
    ///////////////////////////////////////////////////////////////////////////

    //[tutorial_adder
    template <typename Iterator>
    bool adder(Iterator first, Iterator last, double& n)
    {
        bool r = qi::phrase_parse(first, last,

            //  Begin grammar
            (
                double_[ref(n) = _1] >> *(
                    ('+' >> double_[ref(n) += _1]) |
                    ('-' >> double_[ref(n) -= _1])
                )
            )
            ,
            //  End grammar

            space);

        if (first != last) // fail if we did not get a full match
        {
            return false;
        }
        return r;
    }
    //]
}

////////////////////////////////////////////////////////////////////////////
//  Main program
////////////////////////////////////////////////////////////////////////////
int
main()
{
    std::cout << "/////////////////////////////////////////////////////////\n\n";
    std::cout << "\t\tA parser for summing a list of numbers...\n\n";
    std::cout << "/////////////////////////////////////////////////////////\n\n";

    std::cout << "Give me a comma separated list of numbers.\n";
    std::cout << "The numbers are added using Phoenix.\n";
    std::cout << "Type [q or Q] to quit\n\n";

    std::string str;
    while (getline(std::cin, str))
    {
        if (str.empty() || str[0] == 'q' || str[0] == 'Q')
            break;

        double n;
        if (client::adder(str.begin(), str.end(), n))
        {
            std::cout << "-------------------------\n";
            std::cout << "Parsing succeeded\n";
            std::cout << str << " Parses OK: " << std::endl;

            std::cout << "sum = " << n;
            std::cout << "\n-------------------------\n";
        }
        else
        {
            std::cout << "-------------------------\n";
            std::cout << "Parsing failed\n";
            std::cout << "-------------------------\n";
        }
    }

    std::cout << "Bye... :-) \n\n";
    return 0;
}

https://wandbox.org/permlink/5tL2DF9pBZYQNqEQ z oficjalnym gcc działa, ale z najnowszym nieoficjalnym już nie (HEAD) :(
https://wandbox.org/permlink/OW5SrdQHn66CkWCd z clang nie zaobserwowałem problemów.

boost spirit: http://www.boost.org/doc/libs/1_65_1/libs/spirit/doc/html/index.html

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