2013-02-10 3 views
0

Я создаю базу данных пользователей. Когда я пытаюсь открыть "dataBase.txt", который содержит всех пользователей и пароли, консоль появляется (что должно произойти, поскольку это консольное приложение), но в нем говорится, что программа уже завершена. Когда я закрываю его, мой компьютер скажет мне, что программа разбилась. Функция сохраняется в классе.Программа сбой при попытке доступа к файлу, fstream --C++

После некоторой отладки кода, кажется, врезаться в ifstream fin("dataBase.txt");

Ошибка не возвращается из компилятора.

Код для вызываемой функции:

void User_Psw::UserCheck() 
{ 
    // read from the database 
    ifstream fin("dataBase.txt"); 

    while (!fin.eof()) 
    { 
     fin >> Usernames[sizeOfDatabase] >> Password[sizeOfDatabase]; 
     sizeOfDatabase++; //The Number of lines in .txt 
    } 

    // rest of the program 
    cout << "Username: "; 
    cin >> username; 

    getNameIndex(); 

    cout << "Password: "; 
    cin >> password; 

    if(!PasswordMatches()) 
    { 
     cout << "Access denied"; 
    } 
} 

Я могу добавить больше фрагментов кода, если просил.

+1

Я думаю, что у вас больше ошибок. Посмотрите на «fin». Если все остальное не удается, прочитайте документацию! –

+1

Как объявляются «имена пользователей» и «пароли»? Также 'while (! Fin.eof())', вероятно, не делает то, что, по вашему мнению, делает. – Johnsyweb

+1

Почему такие вещи, как 'Usernames [sizeOfDatabase], заставляют меня думать где-то о том, что есть вектор/deque/array/fixed-array, который должен иметь память за один элемент за свой выделенный размер? – WhozCraig

ответ

1

Don't use fin.eof() to control a loop. Эта функция полезна только после провала чтения.

Вероятная причина сбоя заключается в том, что вы назначаете Usernames[sizeOfDatabase], что может быть за пределами Usernames.capacity(). Канонический способ добавления и элемента к std::vector - это позвонить push_back().

Поскольку ваши контейнеры std::vector<std::string>, это лучший подход ...

std::string username, password; 
while (fin >> username >> password) 
{ 
    Usernames.push_back(username); 
    Passwords.push_back(password); 
    ++sizeOfDatabase; 
} 

Конечно, если вы хотите знать количество имен пользователей и паролей, как только файл был прочитан, вы можете позвонить Usernames.size() (который должен быть таким же, как Passwords.size()); это может устранить необходимость сохранения sizeOfDatabase.

Лично я использовал бы один контейнер для имен пользователей и (salted, hashed) passwords, а не два отдельных контейнера; либо std::map<std::string, std::string>, либо, возможно, std::unordered_map<std::string, std::string>, что делает поиск пароля приятным и быстрым для каждого имени пользователя.

+0

Спасибо! это было исправление. Таким образом, это был лучший подход, потому что он просто продолжал бы добавлять новые новые переменные в vars 'username' и' password'? – ponger3d

+0

Правильно, это также останавливает чтение с конца файла. Теперь, *** пожалуйста *** скажите мне, что вы не храните пароли в текстовом формате. – Johnsyweb

+0

Поверьте мне, это не какой-то огромный проект. Я делаю это как учебный опыт. Они хранятся в .txt прямо сейчас, а позже я надеюсь узнать, как их зашифровать, возможно, с помощью функции 'crypt', если я это правильно знаю. Прямо сейчас я просто пытаюсь сделать это там, где у вас может быть учетная запись с сохраненной на ней высокой оценкой. – ponger3d

0

Я думаю, вы должны начать, добавив в конструктор ifstream как вы не указали вы хотите, файл открыт для ввода:

ifstream fin("dataBase.txt", ifstream::in); 

if(!fin.good()) 
{ 
    cout << "Failed to open database file." << endl; 
    return; 
} 

См http://www.cplusplus.com/reference/fstream/ifstream/ifstream/ для дополнительной литературы.

+0

Я сделал изменение 'ifstrea :: in', а затем поставил чек, чтобы проверить, хорош ли файл или нет, но когда я запускаю программу, строка не появляется, говоря« Не удалось открыть файл базы данных ». Поэтому я предполагаю, что это хорошо, но программа по-прежнему падает. – ponger3d

+0

@ ponger3d, если 'fin.good()' fail и вы получите сообщение об ошибке, возможно, у вас нет доступа к каталогу?Я бы сначала решил проблему, вызвав доступ к файлу. – Matthew

Смежные вопросы