简体   繁体   中英

Parsing string in C++

Currently,

I have this string us,muscoy,Muscoy,CA,,34.1541667,-117.3433333 .

I need to parse US and CA. I was able to parse US correctly by this:

std::string line;
std::ifstream myfile ("/Users/settingj/Documents/Country-State Parse/worldcitiespop.txt");    
while( std::getline( myfile, line ) )
{

    while ( myfile.good() )
    {
        getline (myfile,line);
        //std::cout << line << std::endl;

        std::cout << "Country:";
        for (int i = 0; i < 2/*line.length()*/; i++)
        {
            std::cout << line[i];
        }
    }

}

But i'm having an issue parsing to CA.

Heres some code I dug up to find the amount of ',' occurrences in a string but I am having issues saying "parse this string between the 3rd and 4th ',' occurrence.

 // Counts the number of ',' occurrences
 size_t n = std::count(line.begin(), line.end(), ',');
 std::cout << n << std::endl;

You can use boost::split function (or boost::tokenizer ) for this purpose. It will split string into vector<string> .

std::string line;
std::vector<std::string> results;
boost::split(results, line, boost::is_any_of(","));
std::string state = results[3];

It's not for a class... Haha... it seems like a class question though...

I have the solution:

        int count = 0;
        for (int i = 0; i < line.length(); i++)
        {
            if (line[i] == ',')
                count++;
            if (count == 3){
                std::cout << line[i+1];
                if (line[i+1] == ',')
                    break;
            }
        }

Just had to think about it more :P

This is STL version, works pretty well for simple comma separated input files.

#include<fstream>
#include <string>
#include <iostream>
#include<vector>
#include<sstream>

std::vector<std::string> getValues(std::istream& str)
{
    std::vector<std::string>   result;
    std::string   line;
    std::getline(str,line);

    std::stringstream   lineS(line);
    std::string   cell;

    while(std::getline(lineS,cell,','))
        result.push_back(cell);

    return result;
}


int main()
{
    std::ifstream f("input.txt");
    std::string s;

   //Create a vector or vector of strings for rows and columns

   std::vector< std::vector<std::string> > v; 

   while(!f.eof())
      v.push_back(getValues(f));

   for (auto i:v)
   {  
      for(auto j:i)
         std::cout<<j<< " ";
      std::cout<<std::endl;
   }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM