C++:长整型不会写入文件



设计用于允许用户更新其详细信息的小程序。

在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;
}

调用哪些集合函数取决于其他地方的一系列if语句,在if语句之后调用SetFile()。

如果调用Setline3_4,则所有内容都会正确写入文件。但是,如果调用了Setline1或Setline2,则所有内容都会正确地写入文件,除了的user3,它被写为"-36893481841910324",但是-user1、user2和user4都被正确地写入。

我不明白为什么(注意:除了user3是一个长整型之外,所有用户变量都是整型-我认为问题可能就在这里?)

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();
}

因为user3未初始化。所以,它包含一些垃圾价值。只需对其进行初始化,即可避免打印垃圾值。

long long user3 = 0 ; // where you have declared user3 in the program.

选项1-更改类型

你最好用字符串来表示"卡号",因为严格来说,它不是一个你要进行算术运算的"正常"数字。这将完全避免任何数字转换问题。

选项2-检查输入是否正确解析

但是,我可以用以下测试代码复制您的问题:

#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位数字1111111111111111,结果输出为:

C=9223372036854775807

因此,这溢出了长整型中允许的最大值,在我的64位系统中,它是~2^63或9.2x10^18。事实上,如果你播放一个比特,你可以看到它正确地解析,例如9211111111111111111,但在923111111111111111上失败(这会产生C=92233372036854775807)

因此,如果你检查iostream故障位,你可以看到这种情况何时发生:

cin >> C;
bool f = cin.fail();
if (f) { cout << "Answer will be wrong." << endl; }
cout << "C=" << C << endl;

所以我想说,你需要检查你是否真正正确地阅读了输入。

选项3-检查您的构建环境

我在我的系统(Linux amd64 gcc 4.7)上注意到,在某些情况下,ostream的头文件可能无法处理long-long,并且可能会被强制转换为integer。

文件/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

在这里,不存在使用长整型的函数,但我也没有收到编译器警告,告诉我Y将被截断为4个字节。

那么,也许您的环境中有什么原因导致_GLIBCXX_USE_LONG_LONG没有被#定义?我以前从未遇到过这种情况。

最新更新