Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Проблема с записью в файл


Автор: baltushka 14.6.2009, 17:08
Всем доброго времени! У меня есть программа, которая рисует кривую повехность, необходимо многократно посчитать время работы и результат записать в файл. Время работы считает как надо, но насчет fstream идет непрерывная ругань, мол, необъявленный идентификатор!

В fstream.h описан класс basic_fstream, пробовала заменить, результат тот же! Подскажите, что делать??

Привожу часть программы: 
Цитата

#include <windows.h>
#include <stdio.h>
#include <process.h>
#include <math.h>
#include <fstream.h>

#include <iostream.h>

#include <GL\\gl.h>
#include <GL\\glu.h>
#include <GL\\glaux.h> 

   <.....>


void CALLBACK display(void)
{    
    long t0 = GetTickCount();
    fstream f;
    f.open("file.txt",ios::out);

    for (int a=0; a<10; ++a)
   { 
    long t0 = GetTickCount();
    for(int i =0; i < 100; ++i)
   {
    
    int D = 0, j = 0, k, M = 0, mi, ma = 0, x, y;
//double D = 0.;
double s;
int Res[kol] = {15, 32, 31,31, 16, 31, 16, 15, 32,15, 16, 31, 16, 31, 16};

{
    GLfloat knots[8] = {0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0};

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

    glRotatef(330.0, 1, 0., 0.);

    glScalef (0.5, 0.5, 0.5);

    gluBeginSurface(theNurb);

    gluNurbsSurface(theNurb, 
        8, knots,
        8, knots,
        4 * 3,
        3,
        &ctlpoints[0][0][0], 
        4, 4,
        GL_MAP2_VERTEX_3);

    gluEndSurface(theNurb);
    glPopMatrix();

    glFlush();
    auxSwapBuffers();


};

}
    long t1 = GetTickCount();

    std::cout << a << std::endl;
    std::cout <<(t1-t0) << std::endl;
    f<<mas[a]<<" ";
   f.close();

    }

  }



Помогите!!!!!!

Автор: andrew_121 14.6.2009, 17:31
baltushka
Цитата(baltushka @  14.6.2009,  17:08 Найти цитируемый пост)
#include <fstream.h>

#include <iostream.h>

Это пишется без .h

Добавлено через 22 секунды
Компилятор какой?

Автор: baltushka 14.6.2009, 17:53
Исправила, выдает теперь ошибку
Цитата

fatal error C1083: Не удается открыть файл include: fstream: No such file or directory



Цитата(andrew_121 @  14.6.2009,  17:31 Найти цитируемый пост)
Компилятор какой? 

Visual C++ 2008 Express Edition

Автор: andrew_121 14.6.2009, 18:08
Цитата(baltushka @  14.6.2009,  17:53 Найти цитируемый пост)
Не удается открыть файл include: fstream: No such file or directory

О как.... smile  Посмотри есть ли этот файл в c:/programm files/microsoft<дальше не помню>/vc/include. Кароче, поищи каталог include в папке куда установила VC. Так как я никогда не пользовался экспресс версиями.

Автор: baltushka 14.6.2009, 18:16
Честно говоря, не нашла нигде другого компилятора, который нормально бы установился и заработал! если поделитесь, буду благодарна очень!!  smile 

А насчет fstream в include - он там есть!!! не понимаю в чем проблема(((( 

Автор: Cheloveck 14.6.2009, 18:28
Посмотри в настройках IDE должны быть определены пути инклудов. В полной английской версии это Tools/Options -> Projects and Solutions -> VC++ Directories. В категории Include files нужно добавить путь до каталога с iostream, fstream etc., если, конечно, его там нет.

Автор: baltushka 14.6.2009, 18:29
В общем, как было дело: когда я стала добавлять работу с файлом, выянила, что нужен fstream.h. написала #include <fstream.h>, стало выдавать ошибку про неопознанный идентификатор и про "не могу найти fstream". я заглянула в папку include и обнаружила, что там нет файла с таким расширением! есть просто неопознанный файл, который при попытке открыть предлагает на выбор программы. Решив, что это источник всех моих бед, добавила этому файлу расширение .h, и он стал заголовком! после этого ошибка о том, что кто-то чего-то не находит, пропала! я порадовалась=) но осталась проблема с неопознанным идентификатором. исправила fsteram.h и iostream.h на fstream и iostream, вроде заработало, но перестал находиться fsteram (а позже и iostream). Я создала неизвестные файлы, который был первоначально (большим количеством копипастов)), и теперь опять ругань на идентификатор!!! вот как-то так!  smile 

запуталась(( что делать???  smile 

Автор: Cheloveck 14.6.2009, 18:32
Постарайся приводить код в теге code, а не цитата, а то не читается. 

По сабжу

fstream f; замени на ofstream f;

Добавлено через 2 минуты и 11 секунд
Цитата(baltushka @  14.6.2009,  19:29 Найти цитируемый пост)
который при попытке открыть предлагает на выбор программы

Ну и открывай блокнотом. Все стандартные инклуды по, опять же, стандарту без расшерений, так что исправь назад))

Автор: baltushka 14.6.2009, 18:39
Если удалить из папки эти заголовки, он ругается на необъявленный идентификатор!! 
Если удалить неопознанные файлы, ругается на отсутствие их..


Цитата(Cheloveck @  14.6.2009,  18:32 Найти цитируемый пост)
fstream f; замени на ofstream f;


исправила, не помогло(

Добавлено через 1 минуту и 21 секунду
Цитата(Cheloveck @  14.6.2009,  18:32 Найти цитируемый пост)
Постарайся приводить код в теге code, а не цитата, а то не читается. 


хорошо  smile 

Автор: Cheloveck 14.6.2009, 18:42
Цитата(baltushka @  14.6.2009,  19:39 Найти цитируемый пост)
Если удалить из папки эти заголовки, он ругается на необъявленный идентификатор!! 
Если удалить неопознанные файлы, ругается на отсутствие их..


бррр.... какие неопознаные? верни всё как было... В SDK нет ошибок.


Цитата(baltushka @  14.6.2009,  19:39 Найти цитируемый пост)
исправила, не помогло( 


Лог ошибок в студию (только, прошу, верни файлы перед этим на место. Если очень сложно, то удали всё и поставь заново).

Автор: baltushka 14.6.2009, 18:46
Вернула!! я уже убедилась, что после ругани на отсутствие файлов, начинается ругань на неопознанность..  вот она:

Цитата

1>------ Построение начато: проект: gltest1, Конфигурация: Debug Win32 ------
1>Компиляция...
1>main.cpp
1>c:\projects\c++\gltest1\main.cpp(49) : warning C4244: =: преобразование 'double' в 'GLfloat', возможна потеря данных
1>c:\projects\c++\gltest1\main.cpp(50) : warning C4244: =: преобразование 'double' в 'GLfloat', возможна потеря данных
1>c:\projects\c++\gltest1\main.cpp(64) : warning C4305: инициализация: усечение из 'double' к 'GLfloat'
1>c:\projects\c++\gltest1\main.cpp(64) : warning C4305: инициализация: усечение из 'double' к 'GLfloat'
1>c:\projects\c++\gltest1\main.cpp(94) : error C2065: ofstream: необъявленный идентификатор
1>c:\projects\c++\gltest1\main.cpp(94) : error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "f"
1>c:\projects\c++\gltest1\main.cpp(94) : error C2065: f: необъявленный идентификатор
1>c:\projects\c++\gltest1\main.cpp(95) : error C2065: f: необъявленный идентификатор
1>c:\projects\c++\gltest1\main.cpp(95) : error C2228: выражение слева от ".open" должно представлять класс, структуру или объединение
1>        тип: 'unknown-type'
1>c:\projects\c++\gltest1\main.cpp(95) : error C2653: ios: не является именем класса или пространства имен
1>c:\projects\c++\gltest1\main.cpp(95) : error C2065: out: необъявленный идентификатор
1>c:\projects\c++\gltest1\main.cpp(146) : error C2065: f: необъявленный идентификатор
1>c:\projects\c++\gltest1\main.cpp(146) : error C2065: mas: необъявленный идентификатор
1>c:\projects\c++\gltest1\main.cpp(147) : error C2065: f: необъявленный идентификатор
1>c:\projects\c++\gltest1\main.cpp(147) : error C2228: выражение слева от ".close" должно представлять класс, структуру или объединение
1>        тип: 'unknown-type'
1>Журнал построения был сохранен в "file://c:\Projects\C++\gltest1\Debug\BuildLog.htm"
1>gltest1 - ошибок 11, предупреждений 4
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========


P.s. Это не код, пишу цитатой.. =)

Автор: Cheloveck 14.6.2009, 18:49
Код

#include <iostream>
#include <fstream>

int main()
{
    int arr[150];
    for( int i = 0; i < 150; i++, arr[i] = i * 2 );
    std::ofstream f("file.txt");
    for( int i = 0; i < 150; i++ )
        f << arr[i];
    f.close();
    return 0;
}



Может, что углядишь. Это 100% работает

Добавлено через 1 минуту и 6 секунд
кстати, про пространство имён std не забыла?

Автор: andrew_121 14.6.2009, 18:51
Цитата(baltushka @  14.6.2009,  18:39 Найти цитируемый пост)
Если удалить неопознанные файлы

smile НЛО...

Автор: Cheloveck 14.6.2009, 18:56
Цитата(baltushka @  14.6.2009,  19:46 Найти цитируемый пост)
P.s. Это не код, пишу цитатой.. =) 

Есть код "Без подсвети". Здаётся мне, что строки
Код

using namespace std;

в твоём файле нет...

Добавлено через 1 минуту и 49 секунд
Цитата(baltushka @  14.6.2009,  19:46 Найти цитируемый пост)
1>c:\projects\c++\gltest1\main.cpp(146) : error C2065: mas: необъявленный идентификатор

Я, кстати, тоже не вижу объявления o_O

Автор: baltushka 14.6.2009, 19:10
Цитата(Cheloveck @  14.6.2009,  18:49 Найти цитируемый пост)
Может, что углядишь. Это 100% работает


работает! только выдает, точнее, записывает в файл совсем не то, что нужно!!

вот то, что получилось!! но нужно, чтобы проходя по первому циклу в массив добавлялось полученное значение времени!! а в итоге - документ со списком циферок, каждая из которых обозначает время выполнения программы за каждый такт, желательно, чтобы каждая циферка была с новой строки


Код

void CALLBACK display(void)
{
    int arr[5];
    for (int a=0; a<5; ++a,arr[a] = a * 2) // зачем ЭТО умножение???
   {
    std::ofstream f("file.txt");
    long t0 = GetTickCount();
    for(int i =0; i < 100; ++i)
   {
    
    int D = 0, j = 0, k, M = 0, mi, ma = 0, x, y;
double s;
int Res[kol] = {15, 32, 31,31, 16, 31, 16, 15, 32,15, 16, 31, 16, 31, 16};

{
    GLfloat knots[8] = {0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0};

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

    glRotatef(330.0, 1, 0., 0.);

    glScalef (0.5, 0.5, 0.5);

    gluBeginSurface(theNurb);

    gluNurbsSurface(theNurb, 
        8, knots,
        8, knots,
        4 * 3,
        3,
        &ctlpoints[0][0][0], 
        4, 4,
        GL_MAP2_VERTEX_3);

    gluEndSurface(theNurb);
    glPopMatrix();

    glFlush();
    auxSwapBuffers();
};
}
    long t1 = GetTickCount();
    long m = t1-t0;
    f << arr[a];

   std::cout <<m << std::endl;
   f.close();
    }


Добавлено через 1 минуту и 52 секунды
Сейчас все падает =((((

Автор: Cheloveck 14.6.2009, 19:17
Скажи честно, ты думала, когда скопировала приведённый мной код к себе в программу?
Цитата(baltushka @  14.6.2009,  20:10 Найти цитируемый пост)
// зачем ЭТО умножение???

Прикола ради. Я тебе это показал, для образца, а не как панацею к твоей программе. Конечно она выдаёт не то, что тебе нужно....

Автор: baltushka 14.6.2009, 19:55
Друзья!! Ну где же вы?? Так ничего и не получается!!!! =(((

Добавлено через 2 минуты
Цитата(Cheloveck @  14.6.2009,  19:17 Найти цитируемый пост)
Прикола ради. Я тебе это показал, для образца, а не как панацею к твоей программе. Конечно она выдаёт не то, что тебе нужно....


Конечно, думала!!! Но у меня не получается сделать, так, чтобы он выводил то, что нужно!!
Если в конце записываю в переменную t1-t2, а здесь указываю ее, то считает ее необъявленной!! 

Автор: baltushka 14.6.2009, 20:28
Теперь и без файла не работает((( Оох! Нелегкая это работа(((

Добавлено через 1 минуту и 38 секунд
Ребят, подскажите, плиз, что неверного в коде???
Он выдает результат только за один цикл, хотя должен выдать 5 раз время 100*t!! 

Код

void CALLBACK display(void)

 for (int a=0; a<2; ++a);
 { 
    long t0 = GetTickCount();

    for(int i =0; i < 100; ++i);
{
        int D = 0, j = 0, k, M = 0, mi, ma = 0, x, y;
        double s;
        int Res[kol] = {15, 32, 31,31, 16, 31, 16, 15, 32,15, 16, 31, 16, 31, 16};
{
        GLfloat knots[8] = {0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0};

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glPushMatrix();    

        glRotatef(330.0, 1, 0., 0.);

        glScalef (0.5, 0.5, 0.5);

        gluBeginSurface(theNurb);

        gluNurbsSurface(theNurb, 
            8, knots,
            8, knots,
            4 * 3,
            3,
            &ctlpoints[0][0][0], 
            4, 4,
            GL_MAP2_VERTEX_3);

        gluEndSurface(theNurb);
        glPopMatrix();

        glFlush();
        auxSwapBuffers();
};
}
    long t1 = GetTickCount();

   std::cout << t1-t0 << std::endl;

 }
}


Добавлено через 2 минуты и 16 секунд
2 раза, а не 5

Автор: azesmcar 14.6.2009, 21:10
Цитата(baltushka @  14.6.2009,  20:28 Найти цитируемый пост)
for(int i =0; i < 100; ++i);

точка с запятой в конце цикла неверна

Автор: Cheloveck 14.6.2009, 21:15
Вот если ПРАВИЛЬНО оформить твой код, то всё сразу видно

Код

void CALLBACK display(void)

    for (int a=0; a<2; ++a); // Точка с запятой, цикл пустой, следующий код выполняется 1 раз.
    { 
        long t0 = GetTickCount(); // Читаем значение таймера.
        
        for(int i =0; i < 100; ++i); // Точка с запятой, цикл пустой, следующий код выполняется 1 раз.
        {
        
            int D = 0, j = 0, k, M = 0, mi, ma = 0, x, y;
            double s;
            int Res[kol] = {15, 32, 31,31, 16, 31, 16, 15, 32,15, 16, 31, 16, 31, 16};
            { // Скобка ни к чему.
                GLfloat knots[8] = {0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0};
                glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                glPushMatrix();    
                glRotatef(330.0, 1, 0., 0.);
                glScalef (0.5, 0.5, 0.5);
                gluBeginSurface(theNurb);
                gluNurbsSurface(theNurb, 
                    8, knots,
                    8, knots,
                    4 * 3,
                    3,
                    &ctlpoints[0][0][0], 
                    4, 4,
                    GL_MAP2_VERTEX_3);
                gluEndSurface(theNurb);
                glPopMatrix();
                glFlush();
                auxSwapBuffers();
            }; // Скобка и точка с запятой ни к чему.
            
        } // конец цикла for(int i =0; i < 100; ++i);
        
        long t1 = GetTickCount(); // Читаем значение таймера.
        std::cout << t1-t0 << std::endl;
    }
}

Автор: baltushka 14.6.2009, 21:24
 Заработало!!! Спасибо большое!!!!!!!!!
Теперь буду заново с файлами пробовать и оформлять все правильно!!!  smile 

Автор: Cheloveck 14.6.2009, 21:24
Теперь правильная версия

Код

void CALLBACK display(void)

    std::ofstream f("file.txt");

    for (int a=0; a<2; ++a)
    { 
        long t0 = GetTickCount(); // Читаем значение таймера.
        
        for(int i =0; i < 100; ++i)
        {
        
            // long t0 = GetTickCount(); // не тут ли тебе это нужно?
        
            int D = 0, j = 0, k, M = 0, mi, ma = 0, x, y;
            double s;
            int Res[kol] = {15, 32, 31,31, 16, 31, 16, 15, 32,15, 16, 31, 16, 31, 16};

                GLfloat knots[8] = {0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0};
                glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                glPushMatrix();    
                glRotatef(330.0, 1, 0., 0.);
                glScalef (0.5, 0.5, 0.5);
                gluBeginSurface(theNurb);
                gluNurbsSurface(theNurb, 
                    8, knots,
                    8, knots,
                    4 * 3,
                    3,
                    &ctlpoints[0][0][0], 
                    4, 4,
                    GL_MAP2_VERTEX_3);
                gluEndSurface(theNurb);
                glPopMatrix();
                glFlush();
                auxSwapBuffers();

            long t1 = GetTickCount(); // Читаем значение таймера.
            std::cout << t1-t0 << std::endl;  
            
            f <<  t1-t0 << std::endl; // Пишем в файл.
             
        } // конец цикла for(int i =0; i < 100; ++i)
        
    }
    
    f.close();    
}

Автор: azesmcar 14.6.2009, 21:25
Цитата(Cheloveck @  14.6.2009,  21:24 Найти цитируемый пост)
Теперь правильная версия


Цитата(Cheloveck @  14.6.2009,  21:24 Найти цитируемый пост)
for(int i =0; i < 100; ++i);

 smile 

Автор: Cheloveck 14.6.2009, 21:28
azesmcar, ну, недоглядел... сейчас поправлю

Автор: baltushka 14.6.2009, 21:42
Цитата(Cheloveck @  14.6.2009,  21:24 Найти цитируемый пост)
Теперь правильная версия


Сделала!! исправила точку с запятой после цикла. Снова ошибка, теперь такая: 

error C3867: std::basic_ofstream<_Elem,_Traits>::close: в вызове функции отсутствует список аргументов; используйте "&std::basic_ofstream<_Elem,_Traits>::close"

Автор: azesmcar 14.6.2009, 21:43
Цитата(Cheloveck @  14.6.2009,  21:28 Найти цитируемый пост)
azesmcar, ну, недоглядел... сейчас поправлю 

не надо принимать близко к сердцу..напоминаю просто, а то вы с ТС эту точку с запятой уже 2 страницы тащите методом копи-паста smile
с кем не бывает...

Цитата(baltushka @  14.6.2009,  21:42 Найти цитируемый пост)

Сделала!! исправила точку с запятой после цикла. Снова ошибка, теперь такая: 

На какой строке? (ох уж эти ошибки на русском)...

Автор: baltushka 14.6.2009, 21:54
Цитата(azesmcar @  14.6.2009,  21:43 Найти цитируемый пост)
На какой строке? (ох уж эти ошибки на русском)...


Видимо, на 144?

1>c:\projects\c++\gltest1\main.cpp(144) : error C3867: std::basic_ofstream<_Elem,_Traits>::close:

Скажи, пожалуйста, а как сделать так, что номера строк отображались на экране? 

Автор: Cheloveck 14.6.2009, 21:59
Цитата(baltushka @  14.6.2009,  22:54 Найти цитируемый пост)
Скажи, пожалуйста, а как сделать так, что номера строк отображались на экране?

Tools/Options -> Text Editor -> All Languages там галочка Line Numbers... 

думаю, что Инструменты -> Опции -> Текстовый редактор -> Все языки 
примерно так у тебя

Добавлено через 2 минуты и 49 секунд
так что на 144 строке-то?

Автор: azesmcar 14.6.2009, 22:02
Цитата(baltushka @  14.6.2009,  21:54 Найти цитируемый пост)
Видимо, на 144?

Ну вот теперь все сразу стало понятно. Что у нас там на 144 -ой строке написано? Включаю универсальный читатель мыслей на растоянии...дзынь...нет, не работает, зарядка села

Автор: baltushka 14.6.2009, 22:04
О, класс! так гораздо лучше!!  smile 

на 144 строке написано f.close; и, собственно, все!

Автор: Cheloveck 14.6.2009, 22:06
Цитата(baltushka @  14.6.2009,  23:04 Найти цитируемый пост)
на 144 строке написано f.close; и, собственно, все! 

а если написать 
Код

f.close();


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)