Небольшая программа, предназначенная для того, чтобы пользователи могли обновлять свои данные.
Все переменные, инициализированные в функциях get и get, все Вызывается перед любой из заданных функций-функций:
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 в другом месте, при этом SetFile () вызывается после операторов if.
Если Setline3_4 вызывается, все записан в файл правильно. Однако если вызывается Setline1 или Setline2, все записывается в файл правильно Кроме для user3, который записан как «-3689348814741910324», — 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.
Возможно, вам лучше использовать строку для представления «номера карты», потому что строго это не «нормальное» число, с которым вы будете выполнять арифметику. Это позволило бы избежать проблем с числовым преобразованием.
Тем не менее, я могу отчасти повторить вашу проблему с помощью следующего тестового кода:
#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.2×10 ^ 18. На самом деле, если вы играете немного, вы можете видеть, что он правильно разбирается, например, 9211111111111111111, но не работает на 9231111111111111111 (это приводит к C = 9223372036854775807)
Так что получается, если вы проверите битовый бит iostream, вы можете увидеть, когда это произойдет:
cin >> C;
bool f = cin.fail();
if (f) { cout << "Answer will be wrong." << endl; }
cout << "C=" << C << endl;
Поэтому я бы сказал, что вам нужно проверить, правильно ли вы прочитали ввод.
В моей системе (Linux amd64 gcc 4.7) я заметил, что заголовочный файл для ostream в некоторых случаях может долго не обрабатываться и, возможно, он преобразуется в целое число.
Линии 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? Я не сталкивался с этим раньше себя.