旨在让用户更新其详细信息的小程序。
在调用任何set函数函数之前,在get函数和get函数中初始化的所有变量都是 all :
int File::Getline1()
{
std::string filename = std::to_string(user1);
std::ifstream fin(filename + ".txt");
fin.getline (line1, 5);
fin.close();
user1 = (atoi(line1));
return user1;
}
int File::Getline2()
{
std::string filename = std::to_string(user1);
std::ifstream fin(filename + ".txt");
fin.getline (line1, 5);
fin.getline (line2, 5);
fin.close();
user2 = (atoi(line2));
return user2;
}
long long int File::Getline3()
{
std::string filename = std::to_string(user1);
std::ifstream fin(filename + ".txt");
fin.getline (line1, 5);
fin.getline (line2, 5);
fin.getline (line3, 20);
fin.close();
char* endptr = NULL;
return strtoll(line3, &endptr, 10);
}
int File::Getline4()
{
std::string filename = std::to_string(user1);
std::ifstream fin(filename + ".txt");
fin.getline (line1, 5);
fin.getline (line2, 5);
fin.getline (line3, 20);
fin.getline (line4, 5);
fin.close();
user4 = (atoi(line4));
return user4;
}
调用哪些set函数依赖于其他地方的一系列if语句,在if语句之后调用SetFile()。
如果调用Setline3_4,所有内容都会正确写入文件。但是,如果调用Setline1或Setline2,则所有内容都会正确写入文件除以外的用户3,其写为“-3689348814741910324”, - user1,user2和user4可正确写入。
我无法弄明白为什么(注意:所有用户变量都是整数,除了user3这是一个很长的int - 我想也许问题就在这里?)
void File::Setline1()
{
user5 = user1;
filename = std::to_string(user5);
remove((filename + ".txt").c_str());
std::cout << "Enter Line 1: ";
std::cin >> user1;
}
void File::Setline2()
{
std::cout << "Deposit (can be 0): ";
std::cin >> deposit;
std::cout << "\nWithdraw (can be 0): ";
std::cin >> withdraw;
user2 = ((user2 + deposit) - withdraw);
}
void File::Setline3_4()
{
std::cout << "Card Number: ";
std::cin >> user3;
std::cout << "Card Expiry date: ";
std::cin >> user4;
}
void File::Setfile()
{
std::string filename = std::to_string(user1);
std::ofstream fout(filename + ".txt");
fout << user1 << std::endl << user2 << std::endl << user3 << std::endl << user4 << std::endl;
fout.close();
}
答案 0 :(得分:1)
因为user3
未初始化。所以,它包含一些垃圾值。只需初始化它以避免打印垃圾值。
long long user3 = 0 ; // where you have declared user3 in the program.
答案 1 :(得分:1)
最好使用字符串来表示“卡号”,因为严格来说,它不是正常的&#39;你要进行算术运算的数字。这样可以避免任何数字转换问题。
但是,我可以使用以下测试代码来复制您的问题:
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
int main(int argc, char *argv[])
{
long long int A = 1234567890123456;
long long int B = 9999111122223344;
cout << "sizeof(A)=" << sizeof(A) << endl;
cout << "A=" << A << endl;
cout << "B=" << B << endl;
cout << "A,B:" << endl << A << endl << B << endl;
long long int C;
cout << "Number: ";
cin >> C;
cout << "C=" << C << endl;
}
如果输入20位数字11111111111111111111,结果输出为:
C=9223372036854775807
所以这会溢出long long int中允许的最大值,这在我的64位系统上是~2 ^ 63或9.2x10 ^ 18。事实上,如果你玩一点,你可以看到它正确解析,例如,9211111111111111111但失败了9231111111111111111(这产生C = 9223372036854775807)
因此,如果你检查iostream failbit,你可以看到发生这种情况:
cin >> C;
bool f = cin.fail();
if (f) { cout << "Answer will be wrong." << endl; }
cout << "C=" << C << endl;
所以我想说你需要检查一下你是否正确阅读了输入。
我注意到在我的系统(Linux amd64 gcc 4.7)上,ostream的头文件在某些情况下可能无法处理很长时间,并且可能会被转换为整数。
档案/usr/include/c++/4.7/ostream
的第197-205行:
#ifdef _GLIBCXX_USE_LONG_LONG
__ostream_type&
operator<<(long long __n)
{ return _M_insert(__n); }
__ostream_type&
operator<<(unsigned long long __n)
{ return _M_insert(__n); }
#endif
我可以使用以下代码重复您的体验:
#include <iostream>
void function(int x)
{
std::cout << sizeof(x) << "," << x << std::endl;
}
int main(int argc, char *argv[])
{
function(12467753);
long long int Y = 12244444444444444;
function(Y);
}
这给出了以下输出:
4,12467753
4,-510310628
这里,没有使用long long int的函数,但我也没有编译器警告告诉我Y会被截断为4个字节。
因此,您环境中的某些内容可能会导致_GLIBCXX_USE_LONG_LONG不被#defined?我之前没有遇到过这个问题。