【问题标题】:How can I stream different lines of input from one text file?如何从一个文本文件流式传输不同的输入行?
【发布时间】:2017-02-24 18:12:22
【问题描述】:

我正在尝试创建一个模拟,让对象在矩形网格内移动。信息以文本文件的形式给出。示例输入如下:

5 5
0 1 N
PFPFFSF
2 3 S
FSFFSFFSPF

第一行是网格的尺寸(在本例中为 5 x 5,假设左下角坐标为 0,0)

输入的其余部分只是关于对象及其移动方式的信息。每个对象有 2 行输入。第一行是它的起始坐标和方向,而第二行描述它的运动。

当使用输入流时,我如何获取输入以便相应地分组?

我知道第一行,我可以使用

simulationSettings >> x >> y;

获取网格的大小。

但是,有没有办法获取其余的输入并将信息按 2 行分组(对于每个对象)?

因此,例如,流式传输输入,以便我的 object1 将具有 0 1 N 和 PFPFFSF 而对象 2 将具有 2 3 S 和 FSFFSFFPF 等等,如果有更多的对象。

【问题讨论】:

  • 如果输入文件不是很大,将所有输入读取为向量中的对象。现在您可以按照您想要的任何顺序对这些对象进行操作。
  • @MohitJain 这只是一个示例输入。我需要它来处理许多行。我想知道我是否可以让我的程序在流式传输到第一行之后的 2 行时识别。
  • 输入文件中的行长度不同。所以随机访问在这里是不切实际的。您需要一些方法来找到输入行开头的偏移量。
  • 您是否需要逐行读取以检测输入文件中的错误,或者您是否可以假设文件结构良好并读取(按此顺序):网格大小为 2 个整数, 和 n *(2 个整数和 2 个字符串),不管这些行的实际组织方式如何?
  • @ Serge Ballesta 我忘记了操作员 >> 会一直读到下一个空格,所以我可以做 while (simulationSettings >> x >> y >>orientation >> movement) 对吗?一旦有了这些输入,我仍然可以进行错误测试。

标签: c++ ifstream


【解决方案1】:

如果您可以简单地忽略文件的实际结构,那么您的结构就是:

  • 网格大小的 2 个整数值
  • n 次(每个对象):
    • 2 个整数作为初始位置
    • 一个字符串作为初始方向
    • 一串动作

你可以使用:

simulationSettings >> x >> y;
if (! simulationSettings.good()) {
    // process error condition and exit
}
for(;;) {
    int xinit, yinit;
    std::string direction, movements;
    simulationSettings >> xinit;
    if (simulationSettings.eof()) break; // normal end of file
    simulationSetting >> yinit >> direction >> movements;
    if (! simulationSettings.good()) {
        // process error condition and at least break from the loop
    }
    // process the object
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-26
    • 2018-01-29
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    相关资源
    最近更新 更多