C++ difftime() alwas returns 0 - ctime

In this Book object I created a system to keep track of the time a book has been checked out... there is a tm* called dateCheckedOut to store the date that the book is checked out.
int Book::getHeldTime()
{
time_t now ;
time(&now);
tm* t = localtime(&now);
double difference = difftime(now, mktime(dateCheckedOut))/(60 * 60 * 24);
cout << dateCheckedOut->tm_mon << dateCheckedOut->tm_mday << dateCheckedOut->tm_year << endl; //prints out 231117, which is correct.
cout << t->tm_mon << t->tm_mday << t->tm_year << endl; //prints out 34117, which is also correct
cout << difftime(now, mktime(dateCheckedOut)) << endl; //prints out 0
cout << difference << endl; //prints out 0;
return (int)(difference); //returns 0
}
I am quite confused because I checked the date when its checked out and the date when it is loaded, both are correct, but the difftime function just returns 0. Is there anything that might cause this code to not work? Thank in advance!
P.S. dateCheckedOut only has tm_mday, tm_mon, and tm_year set to the correct value, the rest are all not set. Is that a problem?

Related

My code is stuck in an infinite loop in C++

I am trying to use a while loop to calculate the average of 3 inputted grades, but I can not enter the next grade as the loops keep on going without giving me the chance to enter the next grade.
#include<iostream>
using namespace std;
int main()
{
int grade = 0;
int count = 0;
int total = 0;
cout << "Enter grade: ";
cin >> grade;
while (grade != -1)
{
total = total + grade;
count = count + 1;
cout << "Enter next grade: ";
cin >> grade;
}
int(average) = total / 3;
cout << "Average: " << int(average) << endl;
system("pause");
}
I tested your code with integer and it works fine.
If you only take int as input, the best is to put something to check the input type. Use cin.fail() to check if user input anything other than int.
for example:
while(cin.fail()) {
cout << "Error" << endl;
cin.clear();
cin.ignore(256,'\n');
cout << "Please enter grade:"
std::cin >> grade;
}
which I refer from https://www.codegrepper.com/code-examples/cpp/how+to+check+type+of+input+cin+c%2B%2B
and here as well Checking cin input stream produces an integer

C++ string centering alignment

std::vector<std::string> voters;
void LogVoters()
{
if (voters.size() > 0)
{
std::string out;
out.append("\n"); // newline at start
std::cout << "Vote results: ";
for (auto v : voters)
{
char formated_string[256];
std::snprintf(formated_string, sizeof(formated_string), "%s \n", v.c_str());
out.append(formated_string);
}
std::cout << out.c_str();
voters.clear();
}
}
int main() { // this gets called multiple times, thats why in voters string vector will be more names
std::string player_name = "IdontNeedName1337"; // some random name
int vote_option = 0;
char formated_string[256];
std::snprintf(formated_string, sizeof(formated_string), "%6s voted %6s", player_name.c_str(), !vote_option ? "YES." : "NO.");
voters.push_back(formated_string);
LogVoters();
}
output is like
IdontNeedName1337 voted YES.
ElonUsk102 voted NO.
I want
IdontNeedName1337 voted YES.
ElonUsk102 voted NO.
I want to center it like this, please help
edit: this is how it works
so please help me god
"
It looks like your post is mostly code; please add some more details." anoying
That code can't produce that output. Let me make a minimal reproduction of the code you posted to start with:
std::snprintf(formatted, 256, "%6s voted YES", "IdontNeedName1337");
std::cout << formatted;
std::snprintf(formatted, 256, "%6s voted NO", "ElonUsk102");
std::cout << formatted;
This would produce the result
IdontNeedName1337 voted YES.
ElonUsk102 voted NO.
Which isn't what you say you're getting, since it only has one space before "voted". You say you're getting
IdontNeedName1337 voted YES.
ElonUsk102 voted NO.
To get that, your minimal code must be something closer to
std::snprintf(formatted, 256, "%s voted YES", "IdontNeedName1337");
// ^ change here
std::cout << formatted;
std::snprintf(formatted, 256, "%s voted NO", "ElonUsk102");
std::cout << formatted;
Which isn't what you say you have in your code, so I'm largely guessing here.
I'm not sure what you thought the %6s did in the code, since that's basically the answer
std::snprintf(formatted, 256, "%20s voted YES", "IdontNeedName1337");
// ^ change here
std::cout << formatted;
std::snprintf(formatted, 256, "%20s voted NO", "ElonUsk102");
std::cout << formatted;
This tells the formatter to make this entry at least 20 characters wide. By default, it will right-pad with space characters, which matches your desired output.
You could also use std::left, std::setw, std::setfill with a stringstream object to format as per your desired output. The sample code and output are given below-
std::string player_name = "IdontNeedName1337"; // some random name
int vote_option = 0;
stringstream str;
str << std::left << std::setw(20) << std::setfill(' ') << player_name << std::setw(10) << "voted" << std::setw(10) << (!vote_option ? "YES." : "NO.") << endl;
cout << str.str(); // prints formated string
str.str("");
player_name = "ElonUsk102";
vote_option = 1;
str << std::left << std::setw(20) << std::setfill(' ') << player_name << std::setw(10) << "voted" << std::setw(10) << (!vote_option ? "YES." : "NO.") << endl;
cout << str.str(); // prints formated string

Shape Transformers and Interfaces OpenCV3.0

I was trying to make use of the new Shape Transformers and Interfaces of OpenCV3.0. Unfortunately it doesn't work as expected. To ensure not making any fancy warps and getting strange results cause of that reason I initialized a transformation where nothing at all should happen. But output of the transformation for a testpoint is always [0,0] and the warped image is always completley gray. Any suggestions what could be wrong are welcome.
int main(void){
Mat img1 = imread("C:\\opencv\\sources\\samples\\data\\graf1.png", IMREAD_GRAYSCALE);
std::vector<cv::Point2f> points1, testpoints;
vector<DMatch> good_matches;
Mat respic, resmat;
points1.push_back(Point(0, 0)); //Corners 800x600 pic
points1.push_back(Point(799, 0));
points1.push_back(Point(799, 599));
points1.push_back(Point(0, 599));
Mat pointmatrix1(points1);
good_matches.push_back(DMatch(0, 0, 0));
good_matches.push_back(DMatch(1, 1, 0));
good_matches.push_back(DMatch(2, 2, 0));
good_matches.push_back(DMatch(3, 3, 0));
testpoints.push_back(Point(250, 250));
Mat testpointsmat(testpoints);
// Apply TPS
Ptr<ThinPlateSplineShapeTransformer> mytps = createThinPlateSplineShapeTransformer(0);
mytps->estimateTransformation(pointmatrix1, pointmatrix1, good_matches); // Using same pointmatrix nothing should change in res
mytps->applyTransformation(testpointsmat, resmat);
cout << "pointmatrix1 = " << endl << " " << pointmatrix1 << endl << endl;
cout << "testpointsmat = " << endl << " " << testpointsmat << endl << endl;
cout << "resmat = " << endl << " " << resmat << endl << endl; //Always [0,0] ?
imshow("img1", img1); // Just to see if I have a good picture
mytps->warpImage(img1, respic);
imwrite("Tranformed.png", respic);
imshow("Tranformed", respic); //Always completley grey ?
waitKey(0);
return 0;
}
Don't ask me why but if I add this two lines it works.
// Apply TPS
transpose(pointmatrix1, pointmatrix1); // ADD
transpose(testpoints, testpoints); // ADD
Ptr<ThinPlateSplineShapeTransformer> mytps = createThinPlateSplineShapeTransformer(0);
Now There is something strange in source code here why cols and not rows.
by LBerger

Printing dynamically stored string in assembly mips32

I'm working on a mini-compiler and I reached the code generation level.
I want to store a string dynamically to the heap segment, so I wrote this C++ code (cg is the file I'm generating assembly code to) :
int length = strlen("abc");
cg << "\tori\t$a0,$0," << (length + 3) * 4 << endl; // reserve space for type + length + null + size
cg << "\tori\t$v0,$0,9" << endl;
cg << "\tsyscall" << endl;
increamentSP();
cg << "\tsw\t$v0,0($sp)" << endl;
cg << "\tori\t$t1,$0,1" << endl; // store the type
cg << "\tsw\t$t1,0($v0)" << endl;
cg << "\tori\t$t1,$0," << length << endl; // store the length
cg << "\tsw\t$t1," << 4 << "($v0)" << endl;
for (int i = 0; i < length; i++)
{
cg << "\tori\t$t1,$0," << (int)p->val[i] << endl; // store the char
cg << "\tsw\t$t1," << (2 + i) * 4 << "($v0)" << endl;
}
cg << "\tsw\t$0," << (2 + length) * 4 << "($v0)" << endl;
Basically, what I'm trying to do is :
First, I want to store a flag (1) referring that this type is a string to the first location.
Then, I want to store the size of my string to the second location.
After that, I want to store my strings chars to the next locations.
Finally, I want to store a null-terminating char to the last location.
My problem is that when I try to print my string using a code like this :
la $a0,8($t0)
ori $v0,$0,4
syscall
The result is that mips prints only the letter 'a', how can I print a string stored like this? or is there any better way to store my string?
p.s. I know I can use .asciiz in the .data segment, but the problem is that in my code I might edit the string, so I don't exactly know what my string would become.
Can any one help me with that?

reading from a file in visual c++

i am making a project in clr windows form using c++ and im having problem in retrieving the data from the file in a template(vector) when the form is loaded. my form has the button to save the code which calls the save method in the class coded as below. pls suggest what should be the code to retrieve the file, thank you.here record isthe name of the vector.
int men_database::save(int count)
{ ofstream out;
out.open("MALE.txt",ios::out|ios::binary);
if(!out)
return -1;
else
{for(int i=0;i<count;i++)
{out<<'\n'<<record[i].getid();
out<<'\n'<<record[i].getname();
out<<'\n'<<record[i].getsize();
out<<'\n'<<record[i].getcolor();
out<<'\n'<<record[i].getprice();
out<<'\n'<<record[i].getpic();
out<<'\n'<<record[i].getwatch();
}
out.close();
}//else ends
return 1;}
Here is some basic code for reading/writing. Though you might find something better elsewhere. \n is used as delimiter. Each record should have 2 fields (in yours it is 7 fields). Each field must be single-line string. Ps, you get more attention with c++ tag on your question.
int main()
{
{
ofstream f("data.txt");
f << "id1" << endl;
f << "name1" << endl;
f << endl;
f << "id2" << endl;
f << "name2" << endl;
f << endl;
}
{
ifstream f("data.txt");
string id;
string name;
while (f)
{
f >> id;
f >> name;
if (!f) break;
cout << "id: " << id << endl;
cout << "name: " << name << endl;
cout << endl;
}
}
return 0;
}

Resources