如何访问列表容器中加载的文件流中的变量

时间:2016-09-05 04:38:42

标签: c++ c++11

我是学习C ++的新手。我使用变量在列表容器中加载了一个文件流。我希望能够访问和更改任何这些变量的值。我已经尝试了好几周无济于事。有人可以帮忙吗?

这是外部文本文件:flightBoard1.txt

  Delta 3431 Paris JFK
  Usair 2275 EWR London
  Delta 1500 Bonn Milan

这是main.cpp

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

using namespace std;

template<class T, class U, class V>
void changeFlight(list<string> &myFlight, T loc, U value, V newVal);

int main()
{
    string _company;
    int _flight;
    string _origin;
    string _destination;

    list<string> flightBoard;
    stringstream *ssPtr;
    int counter = 0;

    ifstream myFile("flightBoard1.txt");
    while(myFile >> _company >> _flight >> _origin >> _destination ){
        ++counter;
        ssPtr = new stringstream; // you want to put each line in a different slot in the flightBoard list object
        *ssPtr << counter << " " << _company << "\t" << _flight << "\t" << _origin << "\t" << _destination << endl;
        flightBoard.push_back(ssPtr->str()); // You need an arrow, this is a pointer

    }

    list<string>::iterator it;
    for(it = flightBoard.begin(); it != flightBoard.end(); it++){
        cout << *it ;
    }

    int oldFlight, newFlight;
    cout << endl << "Enter old flight number: ";
    cin >> oldFlight;
    cout << "Enter new flight number: ";
    cin >> newFlight;

    changeFlight(flightBoard, ssPtr, oldFlight, newFlight);

    delete ssPtr;
    myFile.close();


    return 0;
}

template<class T, class U, class V>
void changeFlight(list<string> &myFlight, T loc, U value, V newVal){
    list<string>::iterator it;
    cout << endl << "Flight: " << value << " has been changed to: " << newVal << endl;
    for(it = myFlight.begin(); it != myFlight.end(); it++){
        // THIS IS WHERE I AM HAVING A PROBLEM
        // PLEASE UN-COMMENT BELOW TO SEE PROBLEM
        /*if(it -> myFlight -> loc -> value){
            value = newVal;
        }*/ 

    }

}

1 个答案:

答案 0 :(得分:0)

为了解决您的问题,我认为您应该使用更好的结构来存储您的航班。如果您需要进一步操作数据,string不是一个好的类型。我建议引入课程Flight

class Flight
{
  public:
    string company;
    int flight;
    string origin;
    string destination;

    Flight(const string& _company, int _flight, const string& _origin, const string& _destination)
      : company(_company), flight(_flight), origin(_origin), destination(_destination)
    {
    }

    string ToString() const
    {
      stringstream printer;
      printer << company << "\t" << flight << "\t" << origin << "\t" << destination << endl;
      return printer.str();
    }
}; 

您发布的代码段中也存在许多问题。

  • while循环内的内存泄漏。您在每次迭代时分配ssPtr = new stringstream;,但最后只delete分配一次。
  • changeFlight包含太多模板类型参数。如果U value应更改为V newVal changeFlight,那么它可能应该具有相同的类型。
  • 很难更改到处复制的flightBoardlist<string>类型。最好为typedef类型创建list<string>以使代码更简单。例如。 typedef list<string> FlightListType;

以下是修复所有上述问题的代码:

typedef list<Flight> FlightListType;

template<class T>
void changeFlight(FlightListType& myFlight, T value, T newVal);

int main()
{
    string _company;
    int _flight;
    string _origin;
    string _destination;

    FlightListType flightBoard;

    ifstream myFile("flightBoard1.txt");
    while(myFile >> _company >> _flight >> _origin >> _destination )
    {
      flightBoard.push_back(Flight(_company, _flight, _origin, _destination)); 
    }

    FlightListType::const_iterator it;
    int counter = 0;
    for(it = flightBoard.begin(); it != flightBoard.end(); it++)
    {
      cout << counter << " " << (*it).ToString();
      ++counter;
    }

    int oldFlight, newFlight;
    cout << endl << "Enter old flight number: ";
    cin >> oldFlight;
    cout << "Enter new flight number: ";
    cin >> newFlight;

    changeFlight(flightBoard, oldFlight, newFlight);

    myFile.close();

    return 0;
}

template<class T>
void changeFlight(FlightListType& myFlight, T value, T newVal)
{
    FlightListType::iterator it;
    cout << endl << "Flight: " << value << " has been changed to: " << newVal << endl;
    for(it = myFlight.begin(); it != myFlight.end(); it++)
    {
      if ((*it).flight == value)
      {
        // TODO: Here you can do with the Flight what ever you need
        // For example change it's number
        (*it).flight = newVal;
      }
    }
}