I have written a cross-platform code gives a current date(mm/dd/yy) and time(hh/mm/ss) and complete date(yyyymmdd), This code works in windows(MSVS2015) but not working in Linux(GCC 4.8.5).
My code is
#include <iostream>
#ifdef WIN32
#include <windows.h>
#else
#include <cerrno>
#endif
#ifdef WIN32
#include <direct.h>
#include <io.h>
#else
#include <dirent.h>
#include <stdio.h>
#include <unistd.h>
#endif
#include <ctime>
#include <bitset>
#include <cstdlib> /*atol*/
#include <iomanip>
#include <stdexcept>
#include <cstring>
#include <cstdio>
#include <fstream>
using namespace std;
template <size_t size>
void GetNowDateTime(char(&c_date)[size], char(&c_time)[size])
{
time_t t;
struct tm now;
strcpy_s(c_date, "00/00/00");
strcpy_s(c_time, "00:00:00");
time(&t);
if (localtime_s(&now, &t) != 0) return;
char temp[3];
sprintf_s(temp, "%.2d", now.tm_mon + 1);
memcpy(c_date, temp, 2);
sprintf_s(temp, "%.2d", now.tm_mday);
memcpy(c_date + 3, temp, 2);
sprintf_s(temp, "%.2d", now.tm_year - 100);
memcpy(c_date + 6, temp, 2);
sprintf_s(temp, "%.2d", now.tm_hour);
memcpy(c_time, temp, 2);
sprintf_s(temp, "%.2d", now.tm_min);
memcpy(c_time + 3, temp, 2);
sprintf_s(temp, "%.2d", now.tm_sec);
memcpy(c_time + 6, temp, 2);
}
int GetToday(void)
{
time_t t;
struct tm now;
time(&t);
if (localtime_s(&now, &t) != 0) return 0;
return (now.tm_year + 1900) * 10000 + (now.tm_mon + 1) * 100 + now.tm_mday;
}
bool OpenOuputFile(ofstream& outputFile)
{
char buf[1024];
#ifdef WIN32
strcpy_s(buf, "C:\\Myfolder\\output.txt");
#else
strcpy_s(buf, "/home/myfolder/output.txt");
#endif
outputFile.open(buf, ios::out);
if (!outputFile)
{
char szErrorMsg[1024];
strerror_s(szErrorMsg, errno);
cout << "Unable to open input file. " << buf << " Error:" << szErrorMsg << endl;
return 0;
}
return 1;
}
//Here is my main function
int main()
{
char today[9];
char time[9];
ofstream outputFile;
GetNowDateTime(today, time);
int yyyymmdd = GetToday();
if (OpenOuputFile(outputFile))
{
outputFile << "GetNowDateTime functions given is:-\t" << today << "\t" << time << endl;
outputFile << "GetToday Function given is:-\t" << yyyymmdd << endl;
}
else
cout << "No output file written" << endl;
return 0;
}
Errors in Linux is
TimeDate.cpp: In function ‘void GetNowDateTime(char (&)[size], char (&)[size])’:
TimeDate.cpp:34:26: error: there are no arguments to ‘localtime_s’ that depend on a template parameter, so a declaration of ‘localtime_s’ must be available [-fpermissive]
if (localtime_s(&now, &t) != 0) return;
TimeDate.cpp:36:40: error: there are no arguments to ‘sprintf_s’ that depend on a template parameter, so a declaration of ‘sprintf_s’ must be available [-fpermissive]
imeDate.cpp: In function ‘int GetToday()’:
TimeDate.cpp:55:26: error: ‘localtime_s’ was not declared in this scope
if (localtime_s(&now, &t) != 0) return 0;
TimeDate.cpp:74:31: error: ‘strerror_s’ was not declared in this scope
strerror_s(szErrorMsg, errno);
TimeDate.cpp:31:29: error: ‘strcpy_s’ was not declared in this scope
strcpy_s(c_date, "00/00/00");
This program runs on (windows )visual studio 2015 and(Linux) GCC 4.8.5.
I included all required headers but It showing errors when compiling in Linux.
why above errors showing in Linux, Please tell me.
strcpy_s
and friends were Microsoft extensions to c, they were standardised in C11. GCC 4.8.5 doesn't support them and newer versions probably don't either When will the safe string functions of C11 be part of glibc?
sprintf_s
and the other _s
functions are not part of Standard C++. Your program will be restricted to compilers which have those functions as a non-standard extension.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With