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


Автор: Ferrisgeneral 17.6.2012, 01:01
Помогите решить проблему, пожайлуста.

не получается созтать файл, именем у которого является текущая дата (например 17-06-2012.txt)

пытался так:
Код

...
char *str;
SYSTEMTIME st;
GetSystemTime(&st);

sprintf(str, "%s-%s-%s.txt", st.wDay, st.wMonth, st.wYear);
ofstream file(str, ios::app);
...


но вот st.wDay, st.wMonth, st.wYear не хочет конвертировать в строки (если заменить на текст, то все нормально)

Автор: Леопольд 17.6.2012, 01:18
Цитата(Ferrisgeneral @  17.6.2012,  01:01 Найти цитируемый пост)
но вот st.wDay, st.wMonth, st.wYear не хочет конвертировать в строки

Ничего удивительного, это целочисленные переменные
http://msdn.microsoft.com/en-us/library/windows/desktop/ms724950(v=vs.85).aspx

http://liveworkspace.org/code/481de4fcebf0c33cb406acd25d8cd513
Код
#include<ctime>
#include<iostream>

int main()
{
   time_t posixTime = time(NULL);
   std::cout << ctime(&posixTime) << std::endl;
   return 0;
}

Автор: feodorv 17.6.2012, 02:21
Цитата(Леопольд @  17.6.2012,  02:18 Найти цитируемый пост)
Ничего удивительного, это целочисленные переменные

 smile 
Код

sprintf(str, "%.2d-%.2d-%.2d.txt", st.wDay, st.wMonth, st.wYear);

Автор: borisbn 17.6.2012, 10:15
Цитата(feodorv @  17.6.2012,  02:21 Найти цитируемый пост)
sprintf(str, "%.2d-%.2d-%.2d.txt", st.wDay, st.wMonth, st.wYear);

ИМХО так
Код
sprintf(str, "%02d-%02d-%04d.txt", st.wDay, st.wMonth, st.wYear);

лучше будет

Автор: Ferrisgeneral 17.6.2012, 10:35
К сожалению ошибка так и осталась ... вот что пишет когда падает на sprintf:
Unhandled exception at 0x1029a189 (msvcr90d.dll) in Log1.exe: 0xC0000005: Access violation writing location 0x0041774b.

приведу весь метод, может в другом где-то месте делаю ошибку
Код


class Log
{
public:
    static void AddErrorLine();
    .....
};

void Log::AddErrorLine()
{
    /*char *str = NULL;
    char date[9];
    _strdate(date);

    sprintf(str, "%s.txt", date);
    ofstream file(str, ios::app);*/

    char *str;
    SYSTEMTIME st;
    GetSystemTime(&st);
    //sprintf(str, "%s-%s-%s.txt", st.wDay, st.wMonth, st.wYear);

    ofstream file(str, ios::app);

    //Если файл открылся
    if(file.is_open())
    {
        //printf("%d.%d.%d %d:%d:%d - %s\n", st.wDay,st.wMonth,st.wYear,st.wHour,st.wMinute,st.wSecond, "m_EventMessage");

        file << st.wDay << "." << st.wMonth << "." << st.wYear << " " <<
            st.wHour << ":" << st.wMinute << ":" << st.wSecond << " - " <<
            "EventMessage" << endl;
    }
    else    //если файл не открылся
    {
        cout << "Ошибка, не удалось открыть файл для записи" << endl;
    }
}


printf прекрасно работает, а вот sprintf почемуто не хочет.


PS: очень сложно писать на плюсах, после того как долгое время использовал C#

Автор: boostcoder 17.6.2012, 11:24
Цитата(Ferrisgeneral @  17.6.2012,  10:35 Найти цитируемый пост)
char *str;

а память выделять кто будет? ;)

Добавлено через 4 минуты
если лень выделять память, то можно сделать так:
Код

std::stringstream os;
os << st.wDay << "-" << st.wMonth << "-" << st.wYear << ".txt";
const std::string filename = os.str();

или так:
Код

const std::string filename = (boost::format("%1%-%2%-%3%.txt") % st.wDay % st.wMonth % st.wYear).str();


Автор: Ferrisgeneral 17.6.2012, 11:29
спасибо, помогло  smile  ... видимо выделение памяти в ходе тестов то и затер  smile 

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