Reading integers from a text file with words

后端 未结 6 2023
南笙
南笙 2020-12-12 01:48

I\'m trying to read just the integers from a text file structured like this....

ALS 46000
BZK 39850
CAR 38000
//....

using ifstream.

<
6条回答
  •  北海茫月
    2020-12-12 02:28

    Edit: it's in fact possible to work on streams directly with spirit than I suggested previously, with a parser:

    +(omit[+(alpha|blank)] >> int_)
    

    and one line of code(except for variable definitions):

    void extract_file()
    {
        std::ifstream f("E:/dd/dd.trunk/sandbox/text.txt");    
        boost::spirit::istream_iterator it_begin(f), it_end;
    
        // extract all numbers into a vector
        std::vector vi;
        parse(it_begin, it_end, +(omit[+(alpha|blank)] >> int_), vi);
    
        // print them to verify
        std::copy(vi.begin(), vi.end(), 
            std::ostream_iterator(std::cout, ", " ));
    
    }
    

    you get all numbers into a vector at once with one line, couldn't be simpler.


    if you do not mind using boost.spirit2. the parser to get numbers from a line only is

    omit[+(alpha|blank)] >> int_
    

    to extract everything is

    +(alpha|blank) >> int_
    

    See the whole program below(Test with VC10 Beta 2):

    #include   
    #include   
    #include   
    #include  
    #include   
    
    #include 
    #include 
    #include 
    
    using std::cout; 
    
    using namespace boost::spirit;  
    using namespace boost::spirit::qi;    
    
    void extract_everything(std::string& line) 
    {
        std::string::iterator it_begin = line.begin();
        std::string::iterator it_end   = line.end();    
    
        std::string s;
        int i;
    
        parse(it_begin, it_end, +(alpha|blank)>>int_, s, i);
    
        cout << "string " << s  
             << "followed by nubmer " << i 
             << std::endl;
    
    }
    
    void extract_number(std::string& line) 
    {
        std::string::iterator it_begin = line.begin();
        std::string::iterator it_end   = line.end();    
    
        int i;
    
        parse(it_begin, it_end, omit[+(alpha|blank)] >> int_, i);
    
        cout << "number only: " << i << std::endl;
    
    } 
    
    void extract_line()
    {
        std::ifstream f("E:/dd/dd.trunk/sandbox/text.txt");
        std::string s;
        int i; 
    
        // iterated file line by line
        while(getline(f, s))
        {
            cout << "parsing " << s << " yields:\n";
            extract_number(s);  // 
            extract_everything(s);
        }
    
    }
    
    void extract_file()
    {
        std::ifstream f("E:/dd/dd.trunk/sandbox/text.txt");    
        boost::spirit::istream_iterator it_begin(f), it_end;
    
        // extract all numbers into a vector
        std::vector vi;
        parse(it_begin, it_end, +(omit[+(alpha|blank)] >> int_), vi);
    
        // print them to verify
        std::copy(vi.begin(), vi.end(), 
            std::ostream_iterator(std::cout, ", " ));
    
    }
    
    int main(int argc, char * argv[])  
    {    
        extract_line();
        extract_file();
    
        return 0;  
    }
    

    outputs:

    parsing ALS 46000 yields:
    number only: 46000
    string ALS followed by nubmer 46000
    parsing BZK 39850 yields:
    number only: 39850
    string BZK followed by nubmer 39850
    parsing CAR 38000 yields:
    number only: 38000
    string CAR followed by nubmer 38000
    46000, 39850, 38000,
    

提交回复
热议问题