C++文件分析器/stdin输入-这个算法会起作用吗



我正试图在OpenGL中从stdin实现一个行扫描转换,该转换列出了行端点,如下所示:

L 0, 0, 150, 150
L -20, 40, 22, 55
[...]
Z

其中,[…]基本相同,Z字符是一个方便的终止运算符,尽管文件结尾也可以。

考虑到我想在OpenGL中输出这些行,最好先将它们存储到一个数组中,还是一次读取并显示所有行?我的想法是尝试这样的东西(有点伪编码):

bool loadData(int[] lines, string fileName) {
ifstream inputFile;
inputFile.open("fileName.txt");
if (!inputFile.is_open()) {
    return false;
}
if (inputFile.is_open()) {
    while (getline(fileName, i, ',')) {
        //Write to lines array
    }
}
inputFile.close();
}

但是,我不知道如何扩展对Z终止的支持,也不知道如何接受console/stdin输入。我的算法可以简单地扩展处理文件和控制台吗?还是我最好把这种方法分开?

OpenGL应用程序的工作方式通常是,当您被要求重新绘制时,您必须能够重新绘制。例如,当窗口大小发生变化时,您必须能够重新绘制。您可能会被要求在您的窗口被另一个窗口覆盖后重新绘制,然后再打开。

每次需要重新绘制时都加载文件的几何图形会非常低效。我肯定会建议先读一次文件,然后将内容存储在数据结构中。由于您使用的是C++,您可以有一个小的Line对象来存储行的描述,然后使用std::vector<Line>来存储行列表。

至于解析,对我来说,读取主输入循环中的整行似乎最简单,这意味着去掉','分隔符。然后通过测试第一个字符来决定你要处理的是哪一行。如果是Z,则中断输入循环。如果是L,则可以使用std::istringstream来拆分该线。

您可以很容易地将相同的代码用于文件输入和标准输入。std::cin只是另一个流,非常像打开文件得到的std::ifstream。例如,整体布局可能看起来像这样(为了说明而命名):

void yourFileInputMethod(std::istream& inputStrm) {
    // parse content of inputStrm
}
if (youWantToReadFromAFile) {
    std::ifstream inputFile(filename);
    yourFileInputMethod(inputFile);
} else {
    yourFileInputMethod(std::cin);
}

如果你不想要一个额外的方法,你可以对流的引用变量做同样的事情:

std::ifstream inputFile;
if (youWantToReadFromAFile) {
    inputFile.open(filename);
}
std::istream& inputStrm = inputFile.is_open() ? inputFile : std::cin;
// parse content of inputStrm

相关内容

  • 没有找到相关文章

最新更新