c ++:long long int不会写入文件

时间:2014-02-24 11:45:35

标签: c++ file unsigned-long-long-int

旨在让用户更新其详细信息的小程序。

在调用任何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();
}

2 个答案:

答案 0 :(得分:1)

因为user3未初始化。所以,它包含一些垃圾值。只需初始化它以避免打印垃圾值。

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

答案 1 :(得分:1)

选项1 - 更改类型

最好使用字符串来表示“卡号”,因为严格来说,它不是正常的&#39;你要进行算术运算的数字。这样可以避免任何数字转换问题。

选项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位数字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;

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

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

我注意到在我的系统(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?我之前没有遇到过这个问题。