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

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

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

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

15.01.2017, 03:55. Просмотров 222. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа функции ignore() и запись объекта в файл (C++):

Запись объекта класса в файл - C++
Доброго времени суток! нужно сохранить объект вот такого класса: class Act { public: Act(); Act(string...

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

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

Запись в файл объекта класса - C++
Добрый вечер,предположим есть подобный класс,с полями : const SIZE = 10; class myClass { public: int arr; ...

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

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

6
nd2
2414 / 2003 / 705
Регистрация: 29.01.2016
Сообщений: 6,552
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
2061 / 1418 / 320
Регистрация: 05.06.2014
Сообщений: 4,075
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
2414 / 2003 / 705
Регистрация: 29.01.2016
Сообщений: 6,552
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
2414 / 2003 / 705
Регистрация: 29.01.2016
Сообщений: 6,552
15.01.2017, 20:37 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
Привет! Вот еще темы с ответами:

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

Реализовать функции: чтение из файла запись в файл - C++
Взять произвольный текстовый файл (~500 символов). Заполнить &lt;map&gt; так, чтобы программа выводила символ и количество повторений этого...

Как правильно вызывать функцию объекта из другой функции того же объекта? - C++
Доброго дня и ночи, уважаемые программисты! Существует некоторая проблема, на которую я наткнулся, решая задачу по программированию из...

При возврате объекта из функции пишет, что для объекта не определен констуктор копирования - C++
Пишу шаблонный класс матриц. Делаю, значит, переопределение оператора + для двух матриц одного типа. Но компилятор ругается на эту функцию ...


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

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

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