2015-12-29 3 views
0

Программа вылетает, если я пытаюсь использовать ifstream при наличии OpenGL/freeglut. Мой код:Ifstream не работает с OpenGL/freeglut

#include <fstream> 
#include <windows.h> 
#include <GL/freeglut.h> 
double x, y; 
std::ifstream read("coordinates.txt"); 
void display() { 
    glBegin(GL_LINE_STRIP); 
     while (read >> x) //Crashes here 
     { 
      read >> y; 
      glVertex2d(x, y); 
     } 
    glEnd(); 
    glFlush(); 
} 
void key(unsigned char mychar, int x, int y) { 
    if (mychar == 27) { 
     exit(0); 
    } 
} 
void initialize() 
{ 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(-27, 27, -27, 27); 
} 
int main(int argc, char **argv) { 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); 
    glutInitWindowSize(1920, 1080); 
    glutInitWindowPosition(0, 0); 
    glutCreateWindow("Lorenz Attractor"); 
    initialize(); 
    glutDisplayFunc(display); 
    glutKeyboardFunc(key); 
    glColor3d(0, 0, 1); 
    glutFullScreen(); 
    glutMainLoopEvent(); 
    Sleep(60000); 
} 

coordinates.txt:

1.1 1.03 
2.5 2 
3 5.3 

Я даже не нужен включать freeglut, я проверил старый проект, который работал отлично до того, и теперь он выходит из строя, а также. Использование Code :: Blocks with MinGW. Почему это произойдет? Благодаря!

+0

Вы проверили, правильно ли открыт файл, проверив 'read.good()'? – BDL

+0

@BDL Он выводит 1, все еще не работает и сбой. – DDomjosa

ответ

1

display будет называться более одного раза. Он вызывается всякий раз, когда дисплей нужно перерисовать, например, когда окно появляется в поле зрения, другое окно перемещается поверх него, изменяется размер окна и т. Д.

display читает файл. Ну, после первого раза он читает файл, файл будет пустым. В конце концов, вы открыли файл в глобальной переменной (FYI: never do do), и вы продолжали читать, пока файл не был пуст.

Не читайте файлы во время рисования. Прочитайте файл в структуре данных (скажем, vector<float>). Сделайте это до цикла рендеринга. Затем используйте структуру данных для рисования.

+0

Я использовал glutMainLoopEvent(), дисплей будет работать только один раз. Кроме того, сохранение файла в структуре данных не является вариантом, потому что мне в конечном итоге понадобится это, чтобы нарисовать графики из 100 тысяч тысяч координат, поэтому у меня скоро закончится память. Также это не объясняет, почему ifstream не работает вообще, даже без freeglut. – DDomjosa