2014-10-06 57 views
0

我试图实现从标准输入在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的输入,以及支持。我的算法可以扩展处理文件和控制台吗?还是我最好分开方法?

回答

1

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