Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;文件解析器/stdin输入-此算法有效吗?_C++_Opengl_Stdin_Fileparsing - Fatal编程技术网

C++ C++;文件解析器/stdin输入-此算法有效吗?

C++ C++;文件解析器/stdin输入-此算法有效吗?,c++,opengl,stdin,fileparsing,C++,Opengl,Stdin,Fileparsing,我正试图在OpenGL中从stdin实现线扫描转换,该转换列出了线端点,如下所示: L 0, 0, 150, 150 L -20, 40, 22, 55 [...] Z 其中,[…]几乎相同,Z字符是一个方便的终止运算符,尽管文件结尾也可以工作 考虑到我想在OpenGL中输出这些行,最好先将它们存储到数组中,还是一次读取并显示所有行?我的想法是尝试这样的东西(有点假编码): 但是,我不确定如何扩展对Z终止的支持,或者如何接受控制台/stdin输入。我的算法可以简单地扩展处理文件和控制台吗?还是

我正试图在OpenGL中从stdin实现线扫描转换,该转换列出了线端点,如下所示:

L 0, 0, 150, 150
L -20, 40, 22, 55
[...]
Z
其中,[…]几乎相同,Z字符是一个方便的终止运算符,尽管文件结尾也可以工作

考虑到我想在OpenGL中输出这些行,最好先将它们存储到数组中,还是一次读取并显示所有行?我的想法是尝试这样的东西(有点假编码):


但是,我不确定如何扩展对Z终止的支持,或者如何接受控制台/stdin输入。我的算法可以简单地扩展处理文件和控制台吗?还是我最好将这种方法分开使用?

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

每次需要重新绘制时加载文件的几何图形将非常低效。我绝对建议只读取一次文件,并将内容存储在数据结构中。因为你使用C++,你可以有一个小的<代码>行<代码>对象,它存储一行的描述,然后使用<代码> STD::vector < /代码>来存储你的行列表。 至于解析,在我看来,读取主输入循环中的整行代码是最简单的,这意味着去掉
,“
分隔符。然后通过测试第一个字符来决定你要处理的是哪一行。如果是
Z
,则中断输入循环。如果是
L
,您可以使用
std::istringstream
来分离该行

您可以轻松地将相同的代码用于文件输入和标准输入
std::cin
只是另一个流,非常类似于打开文件时得到的
std::ifstream
。例如,总体布局可能如下所示(命名以供说明):

如果不需要额外的方法,可以对流的引用变量执行相同的操作:

std::ifstream inputFile;
if (youWantToReadFromAFile) {
    inputFile.open(filename);
}

std::istream& inputStrm = inputFile.is_open() ? inputFile : std::cin;

// parse content of inputStrm
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