我正试图在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