Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Monkeber
0 / 0 / 0
Регистрация: 20.11.2015
Сообщений: 23
1

Работа функции ignore() и запись объекта в файл

15.01.2017, 03:55. Просмотров 861. Ответов 6

Доброго времени суток, решаю пример из книги, надо создать класс, который хранит время, и при вводе проверять то, что вводит пользователь, писал по аналогичным примерам из книги, и есть пару вопросов. Какова целесообразность использования функции ignore() в первом случае? Без неё программа так же работает, но в книге в подобных ветвлениях она есть. И второй вопрос, в книге предлагают переделывать при записи в файл указатели на объекты в указатели на char, это нормальный ход или же так лучше не делать и есть другой способ? Код программы(при вводе я не написал тут запрос минут и секунд, дабы не делать код совсем громадным на сайте):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include "stdafx.h"
#include <iostream>
#include <fstream>
 
static char times[] = "time.txt";
 
class time
{
private:
    int hours;
    int mins;
    int secs;
public:
    time():hours(0), mins(0), secs(0)
    {}
    time(int h, int m, int s)
    {
        std::fstream file(times, std::ios::binary | std::ios::out);
        file.write(reinterpret_cast<char*>(this), sizeof(*this));
        file.close();
    }
    void gettime();
    void showtime();
};
 
 
void time::gettime()
{
    while (true)
    {
        int h;
        std::cout << "Write hours: "; std::cin >> h;
        if (h > 23 || h < 0)
        {
            std::cout << "Value of hours must be within 0 and 23!";
            std::cin.clear(std::ios::failbit);
        }
        if (std::cin.good())
        {
            std::cin.ignore(10, '\n'); //(1)
            hours = h;
            break;
        }
        std::cin.clear();
        std::cin.ignore(10, '\n');// (2)
    }
}
 
void time::showtime()
{
    std::fstream file(times, std::ios::binary | std::ios::in);
    file.read(reinterpret_cast<char*>(this), sizeof(*this));
    std::cout << "Time: " << hours << ":" << mins << ":" << secs << std::endl;
}
 
int main()
{
    time t1;
    t1.gettime();
    t1.showtime();
    return 0;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.01.2017, 03:55
Ответы с готовыми решениями:

Запись содержимого объекта в файл
Привет всем, 1-й раз столкнулся с файлами и сразу проблема :) Как записать...

Запись в файл объекта класса
Добрый вечер,предположим есть подобный класс,с полями : const SIZE = 10; ...

Запись объекта класса в файл
Доброго времени суток! нужно сохранить объект вот такого класса: class Act {...

Запись в файл объекта класса
class Object { private: int myN; std::vector&lt;std::string&gt; myLines;...

Запись объекта в файл без лишних символов
Добрый день. Изучаю запись/чтение данных в файл и столкнулся с такой проблемой....

6
nd2
2835 / 2403 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
15.01.2017, 05:38 2
Цитата Сообщение от Monkeber Посмотреть сообщение
Какова целесообразность использования функции ignore() в первом случае?
cin.ignore() и cin.clear() натыканы в коде, видимо, без всякого понимания, что они делают.
http://www.cplusplus.com/reference/istream/istream/ignore/
http://www.cplusplus.com/reference/ios/ios/clear/
Цитата Сообщение от Monkeber Посмотреть сообщение
но в книге в подобных ветвлениях она есть.
В каких подобных?
Цитата Сообщение от Monkeber Посмотреть сообщение
в книге предлагают переделывать при записи в файл указатели на объекты в указатели на char, это нормальный ход или же так лучше не делать и есть другой способ?
Предлагают? А без этого компилируется? Функции бинарного чтения/записи оперируют байтами (они же char), поэтому память для таких операций должна указываться как память с байтами (с char).
1
Renji
2114 / 1552 / 473
Регистрация: 05.06.2014
Сообщений: 4,505
15.01.2017, 07:49 3
Цитата Сообщение от Monkeber Посмотреть сообщение
И второй вопрос, в книге предлагают переделывать при записи в файл указатели на объекты в указатели на char, это нормальный ход или же так лучше не делать и есть другой способ?
Нет, это не нормальный ход. К сожалению, объяснить ненормальным авторам метода write что он должен принимать void* достаточно затруднительно. Поэтому, приходится подстраиваться под них и перекастовывать все к char*.
1
Monkeber
0 / 0 / 0
Регистрация: 20.11.2015
Сообщений: 23
15.01.2017, 19:27  [ТС] 4
Цитата Сообщение от nd2 Посмотреть сообщение
cin.clear() натыканы в коде, видимо, без всякого понимания, что они делают.
nd2, с ignore() разобрался, в первом случае он не нужен, спасибо, а можете объяснить почему тут clear() неправильно расставлены? Если количество часов не входит в заданный диапазон, то устанавливается флаг ошибки, пропускается ветвление с выходом из цикла, потом флаги очищаются, и цикл запускается по новой, разве не так?
0
nd2
2835 / 2403 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
15.01.2017, 19:39 5
Цитата Сообщение от Monkeber Посмотреть сообщение
Если количество часов не входит в заданный диапазон, то устанавливается флаг ошибки
Зачем его устанавливать?
0
Monkeber
0 / 0 / 0
Регистрация: 20.11.2015
Сообщений: 23
15.01.2017, 19:54  [ТС] 6
nd2, для проверки вводимого значения, в задании говорится:
"Эта функция(gettime()) должна отдельно спрашивать часы, минуты и секунды, проверяя каждое введенное значение на
наличие флагов ошибок ios, а также проверяя, укладывается ли значение в заданный диапазон. "

Ну, в общем-то да, можно просто проверять значение и тогда выходить из цикла, но в задании нужно именно проверить флаги.
0
nd2
2835 / 2403 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
15.01.2017, 20:37 7
Лучший ответ Сообщение было отмечено Monkeber как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    while (true)
    {
        int h;
        std::cout << "Write hours: "; 
        std::cin >> h;
        if (std::cin.good() && std::cin.peek() == '\n') // проверка на cin.peek() добавляется, если 
                                                        // считать, например, такой ввод ошибочным: 12asdf
        {
            if (h > 23 || h < 0)
            {
                std::cout << "Value of hours must be within 0 and 23!" << std::endl;
                continue;
            }
            hours = h;
            break;
        }
        std::cin.clear();
        cin.ignore((numeric_limits<streamsize>::max)(), '\n'); 
        std::cout << "Input error, repeat input!" << std::endl;
     }
1
15.01.2017, 20:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.01.2017, 20:37

Запись в файл работа с текстом меню и файлы
Добрый вечер, поскажите в чем может быть проблема, реализовал задачу через...

решение функции и запись результата в файл
Условие в прилогаемом файле...

Работа с файлами, запись строки в файл и чтение из файла
Короче у меня задание типа записать строку в old.txt, потом считать это, найти...


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

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

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