简体   繁体   中英

How do I read in certain strings from a file? While discarding ones I do not want in C++

The file that I am reading from contains data about cities. I am wondering how I can extract just the data I want and apply it to my city objects. Below is my city class.

    #include <iostream>
    #include <string>
    #include <cstdlib>
    #include "City.h"
    using namespace std;

    /*
     * Define the constructor for the class 
     */
    City::City(string city_name, string state, int longitude, int latitude, int population) {
        this->city_name = city_name;
        this->state     = state;
        this->longitude = longitude;
        this->latitude = latitude;
        this->population = population;
    }

    /*
     *Accessors
     */ 
    string City::getCity() { 
                return city_name; 
        }

    string City::getState() { 
            return state; 
        }

    int City::getLongitude() {
            return longitude;
        }

    int City::getLatitude() {
            return latitude;
        }

    int City::getPopulation() {
            return population;
        }

    /*
     * Mutators 
     */ 
    void City::setCity(string city_name) {
            this->city_name = city_name;
        }
    void City::setState(string state) {
            this->state = state;
        }
    void City::setLongitude(int longitude) {
            this->longitude = longitude;
        }
    void City::setLatitude(int latitude) {
            this->latitude = latitude;
        }
    void City::setPopulation(int population) {
            this->population = population;
        }


    /*
     * Sorting methods
     */
    void City::sortByCity() {
            // Code to sort cities by city name
    }

    void City::sortByLongitude() {
            // Code to sort cities by longitude
    }  

Here is an example of the type of text the file contains that I want to read from

1063061|OH|Tobias|ppl|Marion|39|101|404118N|0830359W|40.68833|-83.06639|||||985|||Monnett 1063062|OH|Todds|ppl|Morgan|39|115|393129N|0815049W|39.52472|-81.84694|||||983|||Stockport

My question is how do I exclude the '|' characters from my file input stream? As well as how do I extract only the strings that I need. (Ex. Tobias as city_name or OH for state) in order to create my city objects. Thank You

You must load line to string. std::getline() Then you must add some while loop do copy from one string to another.

while(loadedstring!='|')
{
newstring=newstring+loadedstring[i];
i++;
}

use getline with delimiter character '|' and write an inputting sequence adapted to your formatted input data

ifstream myfile ("input.txt");
string s;
getline (myfile,s,'|')

I had an assignment in a CS class that implemented a Logfile Parser that seems to be a good example for you here.

#ifndef _LOGFILE_PARSE_H_
#define _LOGFILE_PARSE_H_

#include string
#include vector
#include fstream
#include sstream
#include time.h

#include "lphashtable.h"
#include "schashtable.h"

/**
 * LogfileParser class: Provides an interface for querying logfiles of a
 * particular format.
 */
class LogfileParser {
    public:
        /**
         * Constructs a new LogfileParser from the name of a log file.
         *
         * @param fname The name of the log file to open.
         */
        LogfileParser( const std::string & fname );

        /**
         * Determines if a given customer has ever visited the given url.
         *
         * @param customer The customer name.
         * @param url The url.
         * @return A boolean value indicating whether the customer visited
         *  the url.
         */
        bool hasVisited( const std::string & customer, const std::string & url ) const;

        /**
         * Determines *when* a customer last visited a given url. If the
         * customer has not visited the given url, the output of this
         * function should be the default time_t.
         *
         * @param customer The customer name.
         * @param url The url.
         * @return A time_t representing when the customer last visited the
         *  given url.
         */
        time_t dateVisited( const std::string & customer, const std::string & url ) const;

        /**
         * Gets all of the unique urls that have been visited.
         *
         * @return A vector of urls that were visited in the logfile. Note
         *  that **there should be no duplicates in this vector**.
         */
        std::vector< std::string > uniquePages() const;

    private:
        /**
         * LogLine structure: Represents the information contained in a
         * single line of the logfile.
         */
        class LogLine {
            public:
                /**
                 * Constructs a LogLine from a string (actual physical line
                 * in the logfile).
                 *
                 * @param line The line in the file to extract info from.
                 */
                LogLine( const std::string & line );

                std::string customer; /**< The customer for this line, */
                std::string url;      /**< The url for this line. */
                time_t date;          /**< The date for this line. */
        };

        /**
         * HashTable used to determine when a customer visited a given url.
         *
         * Hint: think about what your key should be for this. How could
         * you construct a unique, string key to find information for a
         * given customer and url?
         */
        LPHashTable< std::string, time_t > whenVisitedTable;

        /**
         * Vector containing the unique urls found in the logfile. You
         * should fill this in the constructor.
         *
         * @note This vector **should not contain duplicates!**
         */
        std::vector< std::string > uniqueURLs;

};
#endif

Source File:

#include "logfile_parser.h"
#include iostream

using std::string;
using std::vector;
using std::ifstream;
using std::istringstream;

/**
* Constructs a LogLine from a string (actual physical line in the
* logfile).
*
* @param line The line in the file to extract info from.
*/
LogfileParser::LogLine::LogLine( const string & line ) {
    istringstream iss( line );
    iss >> customer;
    customer = customer.substr(1, customer.length()-3);
    iss >> url;
    string dte = "";
    string dline;
    do {
        iss >> dline;
        dte += dline;
    } while( iss );

    date = time(NULL);
    tm * tme = localtime( &date );
    strptime( dte.c_str(), "%c", tme );
    // force correct DST
    tme->tm_isdst = 1;
    date = mktime( tme );
}

/**
* Constructs a new LogfileParser from the name of a log file.
*
* @param fname The name of the log file to open.
*/
LogfileParser::LogfileParser( const string & fname ) : whenVisitedTable( 256 ) {
    SCHashTable< string, bool > pageVisitedTable( 256 );

    ifstream infile( fname.c_str() );
    string line;
    while( infile.good() ) {
        getline( infile, line );

        // if the line length is 0, move on to the next loop iteration
        if( line.length() == 0 )
            continue;           
        // otherwise parse the line and update the hash tables and vector
        LogLine ll( line );
        string uniqueString =(ll.customer + ll.url);
        if(whenVisitedTable.keyExists(uniqueString))
        {
            if(whenVisitedTable[uniqueString] < ll.date)
            whenVisitedTable[uniqueString] = ll.date;
        }
        else if (!whenVisitedTable.keyExists(uniqueString))
            whenVisitedTable.insert(uniqueString, ll.date);


        if(pageVisitedTable.keyExists(ll.url))
            pageVisitedTable[ll.url] = true;        
        else if (!pageVisitedTable.keyExists(ll.url))
        {
            pageVisitedTable.insert(ll.url, true);      
            uniqueURLs.push_back(ll.url);
        }

        /*
        * Given the LogLine above, you should be able to update the member
        * variable hash table and any other hash tables necessary to solve
        * this problem. This should also build the uniqueURLs member
        * vector as well.
        */
    }
    infile.close();
}

/**
* Determines if a given customer has ever visited the given url.
*
* @param customer The customer name.
* @param url The url.
* @return A boolean value indicating whether the customer visited the url.
*/
bool LogfileParser::hasVisited( const string & customer, const string & url ) const {
    string myString = (customer + url);
    if(whenVisitedTable.keyExists(myString))
        return true;
    else return false;

}

/**
* Determines *when* a customer last visited a given url. If the customer
* has not visited the given url, the output of this function should be the
* default time_t.
*
* @param customer The customer name.
* @param url The url.
* @return A time_t representing when the customer last visited the given
*  url.
*/
time_t LogfileParser::dateVisited( const string & customer, const string & url ) const {
    string myString = (customer + url);
    if(whenVisitedTable.keyExists(myString))
        return whenVisitedTable.find(myString);
    else
        return time_t(); // replaceme
}

/**
* Gets all of the unique urls that have been visited.
*
* @return A vector of urls that were visited in the logfile. Note
*  that **there should be no duplicates in this vector**.
*/
vector<string> LogfileParser::uniquePages() const {
    return uniqueURLs;
}


I removed the <> from the #include statements for some so they showed.  I did not write this whole class, a TA did some of it, and I was responsible for the rest.  There are many more files to this, but this is the class that seems to be most relevant for you.

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