Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Запись переменных в файл


Автор: Grief 11.6.2007, 12:47
Помогите разобраться. Есть программа, которая расчитывает некоторые значения, по которым затем строится график. Для рассчетных значений код такой:
Код

for (int i=0;i<NumberPoints;i++)
        {
            XValues[i] = XStart + i * Step;
            YValues[i] = mf.CalcFormDuration(XStart + i * Step, m_Attenuat, m_pSpeed, m_RelativeDuration,
                                    m_TiltDispCharacter, m_LengthWave, m_LengthWaveZeroDisp,
                                    m_DiametrMod, m_NonlineConstit, m_Power, m_pFrequency);        
        }

Необходимо полученные значения (YValues[i]) записать в файл, чтобы потом можно было его прочесть в маткаде и уже там построить графики. Как это возможно сделать? Нашла пример в книге записи в файл строк, а как сделать тоже самое для double? Буду очень признательна за ответы.

Автор: Voldemar2004 11.6.2007, 13:30
Есть готовая функция itoa():
Код
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
   int number = 12345;
   char string[25];

   itoa(number, string, 10);
   printf("integer = %d string = %s\n", number, string);
   return 0;
}


Я не понял, зачем преобразовывать в char, если можно писать в файл и тип double ?

Автор: Grief 11.6.2007, 13:45
Voldemar2004, я уже нашла эту функцию, но 2005 студия ругается и предлагает свою. Все равно не работает. А ка сделать запись в файл типа double?!

Автор: Kuvaldis 11.6.2007, 14:20
Grief, 
Если работаешь в стиле С, то используй fprintf (аналогично printf, но вывод в файл, см. хелп)
Если - в стиле С++, то стандартная работа  с потоками . Только установи манипуляторы точности smile

Автор: Dov 11.6.2007, 14:21
Grief, а char ты как пишешь в файл? Пример покажи, если не трудно.  smile 

Автор: Voldemar2004 11.6.2007, 14:33
Код
#include <fstream.h>
#include <iostream.h>

void SaveToFile(char *FileName, char* Value);

int main(int argc, char* argv[])
{

SaveToFile("D:\\111", "-31232.12321");

return 0;
}


void SaveToFile(char *FileName, char* Value)
{

char* Text;

strcpy( Text, Value );

        ofstream file(FileName);

        file << Text;

        file.close();

}


У меня все работает.

Добавлено через 5 минут и 26 секунд
Или так: но это для Builder'a.
Код
#include <fstream.h>
#include <iostream.h>
#include <vcl.h>

void SaveToFile(char *FileName, double Value);

int main(int argc, char* argv[])
{

SaveToFile("D:\\111", -31232.12321);

return 0;
}


void SaveToFile(char *FileName, double Value)
{

AnsiString Text = FloatToStr(Value);

        ofstream file(FileName);

        file << Text;

        file.close();

}

Автор: Grief 11.6.2007, 15:32
Dov, я попробовала вот так:
Код

for (int i=0;i<NumberPoints;i++)
        {
            XValues[i] = XStart + i * Step;
            YValues[i] = mf.CalcFormDuration(XStart + i * Step, m_Attenuat, m_pSpeed, m_RelativeDuration,
                                    m_TiltDispCharacter, m_LengthWave, m_LengthWaveZeroDisp,
                                    m_DiametrMod, m_NonlineConstit, m_Power, m_pFrequency);
            char * szString = new char[100];
            _itoa_s(YValues[i], szString,100,100);
            strcpy_s(OutFloat[i], szString);

а потом обработка нажатия кнопки в меню, т.е. сама запись:
Код

void CSolGraphView::OnSaveData()
{
    CFile OutFile("data.txt", CFile::modeCreate | CFile::modeWrite);
    for(int loop_index = 0; loop_index < 1000; loop_index++)
    {
        OutFile.Write(OutFloat[loop_index],20);
    }
    OutFile.Close();
}


неправильно видимо =(

Voldemar2004, честно говоря мне не совсем понятно как мне этот код применить к своей задаче, с учетом того, что мне неоходима построчная запись переменных, для дальнейшего использования этих значений в маткаде...  smile 

Автор: Dov 11.6.2007, 20:43
Grief, может что-то такое замутить?  smile 
Для примера:
Код

void CSolGraphView::OnSaveData()
{
    CStdioFile OutFile;
    OutFile.Open("data.txt", CStdioFile::modeCreate | CStdioFile::modeWrite);

    double OutFloat[3] = {3.45, 65.5, 87.103};
    CString buf;

    for(int loop_index = 0; loop_index < 3; loop_index++)
    {
        buf.Format("%g ", OutFloat[loop_index]);
        OutFile.WriteString(buf);
    }

    OutFile.Close();
}

Автор: Grief 11.6.2007, 21:09
Dov, это здорово, только я видимо совсем плоха, как мне вместо 
Код

 double OutFloat[3] = {3.45, 65.5, 87.103};

влепить свою переменную, которая по циклу считается, да еще, чтобы значения в отдельную строку писались, а не через пробел?  smile 


как влепить переменную знаю, а как сделать это построчно?

Автор: Dov 11.6.2007, 21:22
Цитата(Grief @  11.6.2007,  21:09 Найти цитируемый пост)
как мне вместо ... влепить свою переменную, которая по циклу считается

Grief,  ты ж ведь её вычисляешь каким-то образом. Вот и подставь вместо этого.  smile 

Цитата(Grief @  11.6.2007,  21:09 Найти цитируемый пост)
да еще, чтобы значения в отдельную строку писались, а не через пробел?

так:
Код
buf.Format("%g\n", OutFloat[loop_index]);


Автор: Grief 11.6.2007, 21:32
Dov, да, туплю =) ну и последний вопрос тогда: а как сделать, чтобы все это не висло при подсчете значений (у меня их там больше 1000)?

Автор: Dov 11.6.2007, 21:43
Grief, не видя кода твоей программы, ответить на твой вопрос довольно сложно.  smile 

Автор: Grief 11.6.2007, 22:45
Dov, а все, точность просто уменьшила и нормально =) спасибо огромное! smile 

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