Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Файловые потоки. бинарный режим. пишет, но не читает  (Прочитано 9705 раз)
0 Пользователей и 1 Гость смотрят эту тему.
asker
Помогающий

ru
Offline Offline
Пол: Мужской

« : 16-05-2006 09:00 » 

Столкнулся с такой проблемой, с начало приведу код

Метод записи в файл
Код:
char tmp[lenNameUser] = {"Администратор"};

                ofstream fout(m_strNameFileUsers, ios::out | ios::binary);
if (!fout.is_open()) {
                     return false;
}
userLogin = userPass = "Admin";
fout.write(tmp, lenNameUser);
fout.write(userLogin, lenUserLogin);
fout.write(userPass, lenUserPass);
fout.write((char*) true, 1);
fout.flush();

fout.close();

Метод считывания из файла
Код:
// Ищем пользователя с именем (login) strLog
ifstream fin(m_strNameFileUsers, ios::in | ios::binary);

while (!fin.eof()) {
// считываем
fin.read(tmp, lenNameUser);
fin.read(login, lenUserLogin);
fin.read(pass, lenUserPass);
fin.read((char*) isAdmin, 1);
if (fin.eof())
break;
// copy to objects of class CString
userLogin = login;
userPass = pass;
// Удаляем пробелы справа
userLogin.TrimRight(' ');
userPass.TrimRight(' ');
// Проверяем на существование
if (strLog == userLogin && strPass == userPass) {
isFind = true;
break;
}
}

fin.close();

Вопрос такой, почему если последний считанный символ это '\0', то дальше при считывании ниче не читается, ведь это же не конец файла (насколько я знаю), да и eof не реагирует.
« Последнее редактирование: 14-12-2007 15:47 от Алексей1153++ » Записан

С уважением, asker
Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 16-05-2006 11:13 » 

Не очень понятны начальные условия. Например, что за переменные userLogin, userPass, login, pass, isAdmin? Какой они имеют тип? Чему равны переменные lenXXX?
И еще мне неясны вот эти два момента:
Метод записи в файл
Код:
...
fout.write((char*) true, 1);
...

Метод считывания из файла
Код:
...
fin.read((char*) isAdmin, 1);
Что именно здесь происходит? isAdmin - это указатель?
Записан
asker
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 16-05-2006 13:41 » 

        #define lenNameUser 50
   #define lenUserLogin 25
   #define lenUserPass 25

CString userLogin, userPass;
char login[lenUserLogin], pass[lenUserPass];
bool isAdmin;

Код:
fout.write((char*) true, 1);
Я пытяюсь записать булев.-ю переменныю, а здесь
Код:
fin.read((char*) isAdmin, 1);
соответсвенно считать

Записан

С уважением, asker
Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 17-05-2006 06:02 » 

bool isAdmin;
Код:
fout.write((char*) true, 1);
Я пытяюсь записать булев.-ю переменныю, а здесь
Код:
fin.read((char*) isAdmin, 1);
соответсвенно считать
Странно, что у тебя такие вещи вообще работают. Под линуксом, например, это вызовет Segmentation fault. Под виндой, по идее, тоже должна быть "ошибка доступа к памяти". Ведь функция read требует первым параметром указатель...

Попробуй сделать так:
Код:
fout.write((char *)&isAdmin, 1);
...
fin.read((char *)&isAdmin, 1);

Все остальное, в принципе, правильно.
Записан
asker
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 17-05-2006 07:04 » 

Все остальное, в принципе, правильно.
Hooter, в том то и дело, что вроде правильно, но тем не менее данные не считываются, если послдний считанный символ '\0', а почему? Ведь getline переопределен для двух параметров в basic_istream.
« Последнее редактирование: 14-12-2007 15:48 от Алексей1153++ » Записан

С уважением, asker
asker
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 17-05-2006 07:42 » 

Странно, что у тебя такие вещи вообще работают. Под линуксом, например, это вызовет Segmentation fault. Под виндой, по идее, тоже должна быть "ошибка доступа к памяти". Ведь функция read требует первым параметром указатель...
Попробуй сделать так:
Код:
fout.write((char *)&isAdmin, 1);
...
fin.read((char *)&isAdmin, 1);
Hooter действительно у меня и неработало Скромно так... (в смысле знач.-е переменной не записывалось и не считывалось), а теперь работает (это на счет bool), так что спасибо.
« Последнее редактирование: 17-05-2006 07:44 от asker » Записан

С уважением, asker
Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 17-05-2006 07:51 » 

...тем не менее данные не считываются, если послдний считанный символ '\0', а почему? Ведь getline переопределен для двух параметров в basic_istream.
Эта проблема решена?
« Последнее редактирование: 14-12-2007 15:50 от Алексей1153++ » Записан
asker
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 19-05-2006 10:33 » 

...тем не менее данные не считываются, если послдний считанный символ '\0', а почему? Ведь getline переопределен для двух параметров в basic_istream.
Эта проблема решена?
Да, за счет перехода на фунцию read, а с getline так и не получилось с '\0', если только не менять '\0' на другой (скажем на '\n') тогда вроде проходит, но не красиво.
« Последнее редактирование: 14-12-2007 15:52 от Алексей1153++ » Записан

С уважением, asker
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines