c ++: long long int не будет записывать в файл

Небольшая программа, предназначенная для того, чтобы пользователи могли обновлять свои данные.

Все переменные, инициализированные в функциях 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();
}

1

Решение

Так как user3 не инициализируется. Таким образом, он содержит некоторую ненужную ценность. Просто инициализируйте его, чтобы избежать вывода ненужных значений.

long long user3 = 0 ; // where you have declared user3 in the program.
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.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;

Поэтому я бы сказал, что вам нужно проверить, правильно ли вы прочитали ввод.

Вариант 3 — проверить среду сборки

В моей системе (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? Я не сталкивался с этим раньше себя.

1

По вопросам рекламы [email protected]