opengl — C ++ File Parser / stdin input — Будет ли этот алгоритм работать?

Я пытаюсь реализовать преобразование сканирования строки в OpenGL из стандартного ввода, который перечисляет конечные точки строки следующим образом:

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-терминации или принять консольный / стандартный ввод. Может ли мой алгоритм быть расширен для обработки как файлов, так и консоли, или мне лучше разделить подход?

0

Решение

Как работают приложения 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
1

Другие решения


По вопросам рекламы [email protected]