Форум программистов, компьютерный форум CyberForum.ru

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

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

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

16.10.2016, 10:04. Просмотров 243. Ответов 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;
}
Может я туплю, ткните носом что ли >_<
Миниатюры
Считывание из файла   Считывание из файла  
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.10.2016, 10:04     Считывание из файла
Посмотрите здесь:

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

Считывание с файла - C++
Добрый вечер! Считываю с файла посимвольно строку (навсякий случай вот так x = infile.get();) есть ли какая нибудь функция для...

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

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

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

Считывание с файла - C++
2 3 4 5 3 2 9 4 4 5 5 1 2 8 7 0 1 9 2 3 4 3 8 1 5 1 4 2 7 9 4 0 0 7 7 1 9 5 8 5 8 3 0 1 4 8 9 3 4 1 7 7 1 3 3 7 0 1 3 1 0...

Считывание из файла - C++
Создайте конструктор, который считывает координаты центра и радиус из заранее подготовленного текстового файла на магнитном диске и...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nd2
2119 / 1691 / 594
Регистрация: 29.01.2016
Сообщений: 5,450
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. И как это должно туда поместиться?
Evilmonstre
0 / 0 / 0
Регистрация: 27.08.2015
Сообщений: 17
16.10.2016, 10:54  [ТС]     Считывание из файла #3
nd2,
Так код же работает в той функции, где происходит считывание.
Не могли бы вы правильно написать как считывать, а то не доходит до меня...

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

Добавлено через 4 минуты
И если уж Qt используешь, то и методы работы с файлами используй из Qt. QDataStream там есть для таких дел.
Evilmonstre
0 / 0 / 0
Регистрация: 27.08.2015
Сообщений: 17
16.10.2016, 11:10  [ТС]     Считывание из файла #5
nd2,
При записи в двоичный файл чего либо через fstrem, там будет: "8>‡8>‡8>‡8>‡da"(что то типо этого).
А при записи через QDataSteram, я открываю двоичный файл блокнотом и вижу в явном виде: хеш и пароль.
nd2
2119 / 1691 / 594
Регистрация: 29.01.2016
Сообщений: 5,450
16.10.2016, 11:26     Считывание из файла #6
Цитата Сообщение от Evilmonstre Посмотреть сообщение
При записи в двоичный файл чего либо через fstrem, там будет: "8>‡8>‡8>‡8>‡da"(что то типо этого).
Это потому, что у тебя запись неправильная. Если записываешь символы, то хоть в бинарный, хоть в текстовый пиши, всё равно, если открыть в текстовом редакторе, то будет текст (если, конечно, коды записанных символов имеют графическое отображение).
Evilmonstre
0 / 0 / 0
Регистрация: 27.08.2015
Сообщений: 17
16.10.2016, 11:40  [ТС]     Считывание из файла #7
nd2,
out.write((char *)&loginTemp, sizeof(int)*strlen(loginTemp));
То есть это не правильная запись в двоичный файл?
nd2
2119 / 1691 / 594
Регистрация: 29.01.2016
Сообщений: 5,450
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), значит в файл запишется строка, плюс ещё память, за пределами строки, в размер трёх таких строк. Но это, если бы строку записывал, а ты записываешь память под указателем и дальше, дальше... Если ты это хочешь сделать, то тогда, такая запись в двоичный файл - правильная.
Evilmonstre
0 / 0 / 0
Регистрация: 27.08.2015
Сообщений: 17
16.10.2016, 17:34  [ТС]     Считывание из файла #9
nd2, Перепробовал много всего, так и не понял, как записать char* в двоичный файл, чтобы при открытии его там не был логин и пароль в явном виде.
Помогите пожалуйста.
GbaLog-
Любитель чаепитий
2619 / 1158 / 284
Регистрация: 24.08.2014
Сообщений: 4,220
Записей в блоге: 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/...and_text_modes
nd2
2119 / 1691 / 594
Регистрация: 29.01.2016
Сообщений: 5,450
16.10.2016, 17:56     Считывание из файла #11
Цитата Сообщение от GbaLog- Посмотреть сообщение
Открыть файл в бинарном режиме?
И текст перестанет быть текстом?
Цитата Сообщение от Evilmonstre Посмотреть сообщение
Перепробовал много всего, так и не понял, как записать char* в двоичный файл, чтобы при открытии его там не был логин и пароль в явном виде.
Помогите пожалуйста.
Шифруй перед записью.
GbaLog-
Любитель чаепитий
2619 / 1158 / 284
Регистрация: 24.08.2014
Сообщений: 4,220
Записей в блоге: 1
Завершенные тесты: 2
16.10.2016, 17:58     Считывание из файла #12
Цитата Сообщение от nd2 Посмотреть сообщение
И текст перестанет быть текстом?
Да, тут немного погорячился, просто не проверял.
Evilmonstre
0 / 0 / 0
Регистрация: 27.08.2015
Сообщений: 17
16.10.2016, 19:50  [ТС]     Считывание из файла #13
GbaLog-, Файл открыт в бинарном режиме.
nd2, Ну так у меня пароли в виде md5+salt, только думал, что при записи этого в двоичный файл, они должны быть в виде "8>‡8>‡8>‡8MMMMmMM8>‡8>‡". А не в том, в котором я их записываю туда. Поэтому и не стал использовать QDataStream.
nd2
2119 / 1691 / 594
Регистрация: 29.01.2016
Сообщений: 5,450
16.10.2016, 20:00     Считывание из файла #14
Цитата Сообщение от Evilmonstre Посмотреть сообщение
Ну так у меня пароли в виде md5+salt, только думал, что при записи этого в двоичный файл, они должны быть в виде "8>‡8>‡8>‡8MMMMmMM8>‡8>‡". А не в том, в котором я их записываю туда.
Могу только повторить то, о чём уже писал:
Цитата Сообщение от nd2 Посмотреть сообщение
Если записываешь символы, то хоть в бинарный, хоть в текстовый пиши, всё равно, если открыть в текстовом редакторе, то будет текст (если, конечно, коды записанных символов имеют графическое отображение).
Добавлено через 4 минуты
А это у тебя получалось: 8>‡8>‡8>‡8>‡da, из-за того, что записывал совсем не то.
Цитата Сообщение от nd2 Посмотреть сообщение
Но это, если бы строку записывал, а ты записываешь память под указателем и дальше, дальше...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2016, 20:42     Считывание из файла
Еще ссылки по теме:

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

Считывание с файла - C++
char TextForKey=&quot;text text1 text2&quot;;//текст как сделать что бы &quot;text text1 text2&quot; этот текст брался с файла???

Считывание из файла - C++
bool Poisk_Street() { ifstream fin; std::string street,fail; cout&lt;&lt;endl&lt;&lt;&quot;Введите улицу для поиска:&quot;; cin&gt;&gt;street; ...

Считывание из файла - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;fstream&gt; #include &lt;vector&gt; using namespace std; void...

Считывание файла - C++
ВОбщем при считывании файла стандартными способами FILE *file = fopen(filename, &quot;r&quot;); if(file == NULL) { return; } ...


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

Или воспользуйтесь поиском по форуму:
Evilmonstre
0 / 0 / 0
Регистрация: 27.08.2015
Сообщений: 17
16.10.2016, 20:42  [ТС]     Считывание из файла #15
nd2, Спасибо за помощь
Буду тогда использовать QDataStream
Yandex
Объявления
16.10.2016, 20:42     Считывание из файла
Ответ Создать тему
Опции темы

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