- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试从标准输入在 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/
我是一名优秀的程序员,十分优秀!