C++文件解析器/ stdin输入 - 此算法是否工作?
问题描述:
我试图实现从标准输入在OpenGL线扫描转换,列出像这样线终点:C++文件解析器/ stdin输入 - 此算法是否工作?
L 0, 0, 150, 150
L -20, 40, 22, 55
[...]
Z
凡[...]只是更多的相同,而Z字符一个方便的终止操作员,尽管文件结束也可能工作。
鉴于我想在OpenGL中输出这些行,最好先将它们存储到数组中,还是一次读入并显示所有行?我的想法是尝试这样的事情(有点psuedocoded):
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终端,或如何接受控制台/ 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