【问题标题】:Reading multiple variable types from text file C++从文本文件 C++ 中读取多种变量类型
【发布时间】:2016-05-03 17:56:28
【问题描述】:

我正在尝试读取一个看起来像这样的文本文件

bend 6 7
fairbanks 3 5

并逐行重复。内容始终是相同的格式,因此是字符串,然后是 int,然后是 int。

我正在尝试使用 stringstream 来获取文件的每一行,然后将其从那里分开。但是,它似乎根本没有阅读任何内容。这是我目前的尝试:

ifstream infile;
string line, cityName;
int xCoor, yCoor;
City* temp;

infile.open(filename);
while(getline(infile, line))
{
    istringstream iss(line, istringstream::in);

    iss >> cityName;
    while(iss >> xCoor >> yCoor)
    {
        temp = new City(cityName, xCoor, yCoor);
        addCity(temp);
    }
}

该函数被传递一个文件名并收集一个城市的名称,它的 x 和 y 坐标,创建一个新的 City 对象,然后将该城市添加到一个向量中。

我是在滥用 stringstream 还是它不是解决这个问题的好方法?

编辑:

这是地图类

class Map {
    friend class City;
private:
    std::vector<City*> graph;
    void addCity(City* c) { graph.push_back(c); }
    City* findByNamePrivate(std::string cityName);
public:
    Map(std::string filename);
    City* findByName(std::string cityName) { return findByNamePrivate(cityName); }
};

Map 的构造函数是我遇到的问题。

我以为我也包含了这个,但我想没有。

City* Map::findByNamePrivate(string cityName)
{
    for(int i = 0; i < graph.size(); i++)
    {
        if(graph[i]->getName() == cityName)
        {
            return graph[i];
        }
    }
}

在别处调用此行时程序失败

assert(map.findByName("bend") != NULL);

【问题讨论】:

  • 你应该检查infile.open(filename);之后的状态。您确定提供的文件名指向当前工作目录中可访问的文件路径吗?
  • 看起来没问题,只是你没有检查open 的结果。您确定 filename 正确命名文件并在其目录中找到它吗?
  • @John,还要检查您是否有适当的权限来阅读该文件。
  • 指向未读取的文件。我的猜测是你把它放在你的 IDE 的错误文件夹中。如果这是 Visual Studio,则默认文件夹是包含项目文件的文件夹(除非您在项目的调试器选项中更改了默认设置)。其他一些 IDE 默认为可执行文件的位置。
  • 我希望您的城市名称始终是一个单词(例如 New_York 而不是“纽约”),否则您会遇到问题。

标签: c++ file-io


【解决方案1】:

如果你写了“内容总是相同的格式,所以是字符串,然后是 int,然后是 int”,我不明白你为什么要使用 loop while(iss>>xCoord >> yCoord)。对于您的格式,您可以简化阅读过程:

while(infile >> cityName >> xCoor >> yCoor ) {
    addCity(new City(cityName, xCoor, yCoor));
}

【讨论】:

  • 这是一个字符串,int,int,然后换行。这不是多行吗?
  • 它不使用getline() 还是应该替换第二个while循环?
  • @John:你可以使用这个代码块而不是你的代码来读取文件。
  • @John:首先你必须检查文件是否打开: if( infile ) {...} else {std::cerr
  • @John 好吧,相关代码也可以是findByNamePrivate()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
  • 1970-01-01
  • 2013-02-15
  • 2016-05-14
  • 1970-01-01
  • 2016-09-14
相关资源
最近更新 更多