0

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

4

1 回答 1

1

根据 OpenGL 应用程序的工作方式,您通常必须能够在被要求重绘时进行重绘。例如,您必须能够在窗口大小更改时重新绘制。在您的窗口被另一个窗口覆盖后,您可能会被要求重新绘制,然后再被覆盖。

每次需要重绘时为文件加载几何图形会非常低效。我肯定会建议读取文件一次,并将内容存储在数据结构中。由于您使用的是 C++,因此您可以有一个小Line对象来存储行的描述,然后使用 astd::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
于 2014-10-07T05:56:53.263 回答