gpt4 book ai didi

C++ 文件解析器/stdin 输入——这个算法行得通吗?

转载 作者:行者123 更新时间:2023-11-28 06:39:22 25 4
gpt4 key购买 nike

我正在尝试从标准输入在 OpenGL 中实现线扫描转换,它列出了线端点,如下所示:

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 终止的支持,或者如何接受控制台/标准输入。可以扩展我的算法来简单地处理文件和控制台,还是我最好将方法分开?

最佳答案

按照 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

关于C++ 文件解析器/stdin 输入——这个算法行得通吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26225638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com