1

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

在 get 函数和 get 函数中初始化的所有变量都在调用任何 set 函数之前调用:

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除外,它写为“-3689348814741910324”,但 user1、user2 和 user4 都正确写入。

我不知道为什么(注意:所有用户变量都是整数,除了 user3 是一个 long long 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();
}
4

2 回答 2

1

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

long long user3 = 0 ; // where you have declared user3 in the program.
于 2014-02-24T11:50:12.913 回答
1

选项 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 位数字 11111111111111111111,则结果输出为:

C=9223372036854775807

所以这溢出了 long long int 中允许的最大值,在我的 64 位系统上是 ~2^63 或 9.2x10^18。事实上,如果你玩一点,你可以看到它正确解析,例如,9211111111111111111 但在 9231111111111111111 上失败(这会产生 C=9223372036854775807)

所以事实证明,如果您检查 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 并且可能它们被强制转换为整数。

文件的第 197-205 行/usr/include/c++/4.7/ostream

#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 ?我自己之前没有遇到过这种情况。

于 2014-02-24T12:23:19.537 回答