Файл, из которого я читаю, содержит данные о городах. Мне интересно, как я могу извлечь только те данные, которые я хочу, и применить их к моим городским объектам. Ниже мой класс города.
#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
}
Вот пример типа текста, который содержит файл, из которого я хочу прочитать
1063061 | OH | Tobias | госзакупках | Марион | 39 | 101 | 404118N | 0830359W | 40,68833 | -83,06639 ||||| 985 ||| Monnett
1063062 | OH | Todds | госзакупках | Morgan | 39 | 115 | 393129N | 0815049W | 39,52472 | -81,84694 ||||| 983 ||| стокпорт
Мой вопрос, как я могу исключить «|» символы из моего файла ввода потока? А также как мне извлечь только те строки, которые мне нужны. (Например, Тобиас в качестве city_name или OH для штата) для создания объектов моего города. Благодарю вас
используйте getline с символом разделителя ‘|’ и напишите последовательность ввода, адаптированную к вашим отформатированным входным данным
ifstream myfile ("input.txt");
string s;
getline (myfile,s,'|')
Вы должны загрузить строку в строку. станд :: GetLine ()
Затем вы должны добавить цикл while для копирования из одной строки в другую.
while(loadedstring!='|')
{
newstring=newstring+loadedstring[i];
i++;
}
У меня было задание в классе CS, в котором реализован парсер лог-файлов, который, кажется, является хорошим примером для вас здесь.
#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
Исходный файл:
#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.