Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Evilmonstre
0 / 0 / 0
Регистрация: 27.08.2015
Сообщений: 19
#1

Считывание из файла - C++

16.10.2016, 10:04. Просмотров 313. Ответов 14
Метки нет (Все метки)

Нужна помощь, уже не знаю, что делать.
Проблема:
Имеется функция для добавления хешированного логина и пароля в двоичный файл.
Добавление вроде работает т.к. при попытке считать (закоментированный кусок кода в функции addUser), он правильно выводит в Debug, то, что я записал.
Но если я беру кусок кода, который закомментирован и вставляю в другую функицю, то там он уже при считывании вывод какие-то иероглифы в Debug.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void UserAccounts::addUser(QString login, QString password)
{
    /*---Из QString в  char---*/
    QByteArray qba = login.toLatin1();
    char *loginTemp = qba.data();
    qba = password.toLatin1();
    char *passwordTemp = qba.data();
    /*-----------------------*/
 
    std::ofstream out("users.bin", ios::binary);
    out.write((char *)&loginTemp, sizeof(int)*strlen(loginTemp));
    out.write((char *)&passwordTemp, sizeof(int)*strlen(passwordTemp));
    out.close();
 
    //qDebug() << "login: " << loginTemp << '\n' << "pass: " << passwordTemp;
 
   /* char *login123 = "                                ";
    char *password123 = "                                ";
    std::ifstream in("users.bin", ios::binary);
    in.seekg(0, ios_base::beg);
    in.read ((char *)&login123, sizeof(int)*strlen(login123));
    in.read ((char *)&password123, sizeof(int)*strlen(password123));
    qDebug() << "login: " << login123 << "password" << '\n' << password123;*/
}
Другая функция, где считывание не работает:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
bool UserAccounts::checkUser(QString loginTemp, QString passTemp)
{
    char *login123 = "                                ";
    char *password123 = "                                ";
    std::ifstream in("users.bin", ios::binary);
    in.seekg(0, ios_base::beg);
    in.read ((char *)&login123, sizeof(int)*strlen(login123));
    in.read ((char *)&password123, sizeof(int)*strlen(password123));
    qDebug() << "login: " << login123 << "password" << '\n' << password123;
    return true;
}
Может я туплю, ткните носом что ли >_<
0
Миниатюры
Считывание из файла   Считывание из файла  
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.10.2016, 10:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Считывание из файла (C++):

Заменить считывание с клавиатуры на считывание из файла - C++
Помогите пожалуйста, ни разу не работал со считыванием из файла поэтому не понимаю как и что делать. Почитал в интернете, попробовал, не...

Считывание файла в массив и запись нового файла - C++
Консоль VS C++. Текстовый файл открывается как бинарный, и считывается по 100 байт в массив - и сразу они переписываются в другой файл. В...

Считывание с файла - C++
ВСЕМ ПРИВЕТ!Я пишу программу смысл ее такой: создан файл key.txt(в этом файле написано 1234) при запуске программы она нам покажет если в...

Считывание с файла - C++
Помогите организовать считывание с файла для следующего задания: Нужно создать программу которая считывает с файла параметры...

Считывание с файла - C++
Здравствуйте. Нужна помощь в написании программы: Дана непустая последовательность слов разделенных пробельными символами, расположенных...

Считывание из файла - C++
#include &lt;iostream&gt; #include &lt;time&gt; #include &lt;fstream&gt; using namespace std; int linear_search(int array, int size, int...

14
nd2
2481 / 2070 / 723
Регистрация: 29.01.2016
Сообщений: 6,794
16.10.2016, 10:34 #2
Цитата Сообщение от Evilmonstre Посмотреть сообщение
char *login123 = " ";
char *password123 = " ";
Это указатели на строковые литералы, память только для чтения, а ты туда что-то записать пытаешься.

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

Добавлено через 1 минуту
Цитата Сообщение от Evilmonstre Посмотреть сообщение
(char *)&login123
И не нужно у указателя адрес брать и к char* приводить (и так char*).

Добавлено через 5 минут
Цитата Сообщение от Evilmonstre Посмотреть сообщение
in.read ((char *)&login123, sizeof(int)*strlen(login123));
В массив char читаешь int, в количестве, равном размеру массива char. И как это должно туда поместиться?
0
Evilmonstre
0 / 0 / 0
Регистрация: 27.08.2015
Сообщений: 19
16.10.2016, 10:54  [ТС] #3
nd2,
Так код же работает в той функции, где происходит считывание.
Не могли бы вы правильно написать как считывать, а то не доходит до меня...

Добавлено через 3 минуты
Ну и про правильное выделение памяти под char
0
nd2
2481 / 2070 / 723
Регистрация: 29.01.2016
Сообщений: 6,794
16.10.2016, 10:59 #4
Цитата Сообщение от Evilmonstre Посмотреть сообщение
Так код же работает в той функции, где происходит считывание.
Как и почему он у тебя работает - это отдельная тема. На правильность кода это никак не влияет. У тебя написано - непонятно что. Зачем, если записываешь в файл (и читаешь из файла) байты (char), умножаешь количество байт (char) на размер int?

Добавлено через 4 минуты
И если уж Qt используешь, то и методы работы с файлами используй из Qt. QDataStream там есть для таких дел.
0
Evilmonstre
0 / 0 / 0
Регистрация: 27.08.2015
Сообщений: 19
16.10.2016, 11:10  [ТС] #5
nd2,
При записи в двоичный файл чего либо через fstrem, там будет: "8>‡8>‡8>‡8>‡da"(что то типо этого).
А при записи через QDataSteram, я открываю двоичный файл блокнотом и вижу в явном виде: хеш и пароль.
0
nd2
2481 / 2070 / 723
Регистрация: 29.01.2016
Сообщений: 6,794
16.10.2016, 11:26 #6
Цитата Сообщение от Evilmonstre Посмотреть сообщение
При записи в двоичный файл чего либо через fstrem, там будет: "8>‡8>‡8>‡8>‡da"(что то типо этого).
Это потому, что у тебя запись неправильная. Если записываешь символы, то хоть в бинарный, хоть в текстовый пиши, всё равно, если открыть в текстовом редакторе, то будет текст (если, конечно, коды записанных символов имеют графическое отображение).
0
Evilmonstre
0 / 0 / 0
Регистрация: 27.08.2015
Сообщений: 19
16.10.2016, 11:40  [ТС] #7
nd2,
out.write((char *)&loginTemp, sizeof(int)*strlen(loginTemp));
То есть это не правильная запись в двоичный файл?
0
nd2
2481 / 2070 / 723
Регистрация: 29.01.2016
Сообщений: 6,794
16.10.2016, 13:07 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Evilmonstre Посмотреть сообщение
out.write((char *)&loginTemp, sizeof(int)*strlen(loginTemp));
То есть это не правильная запись в двоичный файл?
loginTemp - у тебя это char*. Первым параметром write() должен быть char*. Зачем тогда ты берёшь адрес у указателя и приводишь его к char*, если и так это char*?
loginTemp - это, у тебя, указатель на Си-сроку, поэтому strlen(loginTemp) выдаст количество символов в строке (не считая '\0'). Ты умножаешь это количество ещё на 4 (размер int), значит в файл запишется строка, плюс ещё память, за пределами строки, в размер трёх таких строк. Но это, если бы строку записывал, а ты записываешь память под указателем и дальше, дальше... Если ты это хочешь сделать, то тогда, такая запись в двоичный файл - правильная.
1
Evilmonstre
0 / 0 / 0
Регистрация: 27.08.2015
Сообщений: 19
16.10.2016, 17:34  [ТС] #9
nd2, Перепробовал много всего, так и не понял, как записать char* в двоичный файл, чтобы при открытии его там не был логин и пароль в явном виде.
Помогите пожалуйста.
0
GbaLog-
Любитель чаепитий
3095 / 1434 / 348
Регистрация: 24.08.2014
Сообщений: 5,086
Записей в блоге: 1
Завершенные тесты: 2
16.10.2016, 17:49 #10
Цитата Сообщение от Evilmonstre Посмотреть сообщение
как записать char* в двоичный файл, чтобы при открытии его там не был логин и пароль в явном виде.
Открыть файл в бинарном режиме?
C++
1
std::ofstream out( "file.bin", std::ios::binary );
http://en.cppreference.com/w/cpp/io/ios_base/openmode
http://en.cppreference.com/w/cpp/io/c#Binary_and_text_modes
0
nd2
2481 / 2070 / 723
Регистрация: 29.01.2016
Сообщений: 6,794
16.10.2016, 17:56 #11
Цитата Сообщение от GbaLog- Посмотреть сообщение
Открыть файл в бинарном режиме?
И текст перестанет быть текстом?
Цитата Сообщение от Evilmonstre Посмотреть сообщение
Перепробовал много всего, так и не понял, как записать char* в двоичный файл, чтобы при открытии его там не был логин и пароль в явном виде.
Помогите пожалуйста.
Шифруй перед записью.
0
GbaLog-
Любитель чаепитий
3095 / 1434 / 348
Регистрация: 24.08.2014
Сообщений: 5,086
Записей в блоге: 1
Завершенные тесты: 2
16.10.2016, 17:58 #12
Цитата Сообщение от nd2 Посмотреть сообщение
И текст перестанет быть текстом?
Да, тут немного погорячился, просто не проверял.
0
Evilmonstre
0 / 0 / 0
Регистрация: 27.08.2015
Сообщений: 19
16.10.2016, 19:50  [ТС] #13
GbaLog-, Файл открыт в бинарном режиме.
nd2, Ну так у меня пароли в виде md5+salt, только думал, что при записи этого в двоичный файл, они должны быть в виде "8>‡8>‡8>‡8MMMMmMM8>‡8>‡". А не в том, в котором я их записываю туда. Поэтому и не стал использовать QDataStream.
0
nd2
2481 / 2070 / 723
Регистрация: 29.01.2016
Сообщений: 6,794
16.10.2016, 20:00 #14
Цитата Сообщение от Evilmonstre Посмотреть сообщение
Ну так у меня пароли в виде md5+salt, только думал, что при записи этого в двоичный файл, они должны быть в виде "8>‡8>‡8>‡8MMMMmMM8>‡8>‡". А не в том, в котором я их записываю туда.
Могу только повторить то, о чём уже писал:
Цитата Сообщение от nd2 Посмотреть сообщение
Если записываешь символы, то хоть в бинарный, хоть в текстовый пиши, всё равно, если открыть в текстовом редакторе, то будет текст (если, конечно, коды записанных символов имеют графическое отображение).
Добавлено через 4 минуты
А это у тебя получалось: 8>‡8>‡8>‡8>‡da, из-за того, что записывал совсем не то.
Цитата Сообщение от nd2 Посмотреть сообщение
Но это, если бы строку записывал, а ты записываешь память под указателем и дальше, дальше...
1
Evilmonstre
0 / 0 / 0
Регистрация: 27.08.2015
Сообщений: 19
16.10.2016, 20:42  [ТС] #15
nd2, Спасибо за помощь
Буду тогда использовать QDataStream
0
16.10.2016, 20:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2016, 20:42
Привет! Вот еще темы с ответами:

Считывание из файла - C++
Ребят,подскажите пожалуйста: Нужно считать из файлов значения. Я создал два класса,в которых есть переменные,в которые будут считываться...

считывание из файла c++ - C++
считываю из файла, но он не читает все строки, почему не знаю. Может кто-нибудь помочь? ifstream file(&quot;1.txt&quot;,ios::in); char...

Считывание из файла - C++
Всем привет! Есть вот такая проблема: при считывании данных из файла в объект ниоткуда берутся лишние данные. В чем может быть проблема?...

Считывание из файла - C++
как считать из файла число, в котором оно будет задаваться в виде ASCII графики где белый цвет обозначен символом &quot;.&quot;, светло-серый - &quot;%&quot;,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru