Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
meJevin
158 / 150 / 92
Регистрация: 18.11.2015
Сообщений: 677
Завершенные тесты: 1
1

Ошибки в перегрузке << и >>

17.04.2016, 11:50. Просмотров 386. Ответов 12
Метки нет (Все метки)

Привет, я делаю упражнение, но у меня не выходит считывать информацию с файла.

Вот код:
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
class Employee {
private:
    std::string name;           // Имя 
    std::string middle_name;    // Отчество
    std::string last_name;      // Фамилия
 
    unsigned int number;        // Номер
 
public:
    void getData() {
        std::cout << "Введите имя: "; std::getline(std::cin, name);
        std::cout << "Введите фамилию: "; std::getline(std::cin, last_name);
        std::cout << "Введите отчество: "; std::getline(std::cin, middle_name);
        cinNum(number, "Введите номер: ");
    }
    void showData() {
        std::cout << "Фамилия: " << last_name << "\n";
        std::cout << "Имя: " << name << "\n";
        std::cout << "Отчество: " << middle_name << "\n";
        std::cout << "Номер: " << number << "\n";
    }
 
    friend std::ostream& operator<<(std::ostream&, Employee&);
    friend std::istream& operator>>(std::istream&, Employee&);
};
 
std::ostream& operator<<(std::ostream& os, Employee& em) {
    if (typeid(os) == typeid(std::ofstream))
        os.write((char*)&em, sizeof(em));
    else
        em.showData();
 
    return os;
}
 
std::istream& operator>>(std::istream& is, Employee& em) {
    if (typeid(is) == typeid(std::ifstream))
        is.read((char*)&em, sizeof(em));
    else
        em.getData();
 
    return is;
}
 
int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    std::string path = "Employee.dat";
 
    std::ofstream outFile;
    outFile.open(path, std::ios::app);
 
    //if (!outFile) perror(path.c_str()); _getch(); return -1; // проверка на ошибки тоже не работает
 
    while (1) {
        Employee temp;
 
        std::cin >> temp;
        outFile << temp;
 
        std::cout << "1 - Продолжить; 2 - Закончить\n";
        if (_getch() == '2')
            break;
    }
    outFile.close();
 
    system("cls");
    std::cout << "Содержимое файла Employee.dat\n\n";
 
    std::ifstream inFile;
    inFile.open(path);
 
    //if (!inFile) perror(path.c_str()); _getch(); return -1; // проверка на ошибки тоже не работает
 
    while (!inFile.eof()) {
        Employee temp;
        inFile >> temp;
        std::cout << temp << "\n";
    }
    inFile.close();
 
    _getch();
    return 0;
}
У меня, вроде, на файл все записывается, но не читается, помогите пожалуйста.



Задание звучит так:
В цикле запрашивайте у пользователя данные, состоящие из имени, отчества, фамилии и номера работника (типа unsigned long). Затем осуществите форматированный вывод в объект ofstream с помощью оператора вставки (<<). Не забывайте, что строки данных должны оканчиваться пробелами или другими разделителями. Когда пользователь сообщит об окончании ввода, закройте объект ofstream, откройте объект ifstream, прочитайте и выведите на экран все данные из файла, после чего завершите программу.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.04.2016, 11:50
Ответы с готовыми решениями:

Ошибки при перегрузке оператора <<
dc.cpp не видит private поля из dc.h dc.h #pragma once #include &lt;cmath&gt; class dc {

Ошибки при перегрузке операторов
Ну не могу,не получается самостоятельно разобрать свои ошибки(( Они по большей части повторяются....

Ошибки при перегрузке операторов класса
Задали в универе для класа триугольника с полями 3х сторон реализовать перегрузку операторов &lt;&lt;,...

Вопрос о перегрузке ++/--
Рассмотрим простой пример постфиксной и префиксной операции инкремента: int main() { int i=0;...

Ошибка в перегрузке
Заголовок #ifndef CHALLENGE_H #define CHALLENGE_H #include &lt;ostream&gt; using std::ostream; ...

12
Renji
2513 / 1719 / 515
Регистрация: 05.06.2014
Сообщений: 4,981
17.04.2016, 11:55 2
1) read/write нельзя использовать для стрингов. И вообще ни для чего нельзя использовать, кроме int/char/double/массивов и структур из вышеперечисленного.
2) На кой черт вам typeid понадобился? Тем более, что если писать как у вас, то вместо него встанет не функциональная заглушка.
0
nmcf
6533 / 5757 / 2621
Регистрация: 14.04.2014
Сообщений: 24,494
17.04.2016, 11:55 3
По заданию запись выполняется в текстовом режиме, почему у тебя read/write, который ещё и кривой?
0
meJevin
158 / 150 / 92
Регистрация: 18.11.2015
Сообщений: 677
Завершенные тесты: 1
17.04.2016, 12:02  [ТС] 4
Renji, не знаю, я думал с помощью typeid смогу определить, что делает с оператором пользователь. При cout, например, буду использовать методы класса, а при записи в файл буду писать на файл с помощью write.

Добавлено через 2 минуты
nmcf, а, в текстовом я смогу тогда сам. А read/write я не особо умею пользоваться. Почему они кривые, как правильно их записать? Все равно интересно, почему эта программа не работает же.
0
17.04.2016, 12:02
Renji
2513 / 1719 / 515
Регистрация: 05.06.2014
Сообщений: 4,981
17.04.2016, 12:06 5
Цитата Сообщение от meJevin Посмотреть сообщение
При cout, например, буду использовать методы класса, а при записи в файл буду писать на файл с помощью write.
Это делается через перегрузку функций. Объявляете рядышком std::ostream& operator<<(std::ofstream& os, Employee& em) и конкретно вывод в ofstream идет туда. Правда, смыслу никакого, так как интерфейсы ofstream и cout практически идентичны (на 99% - std::ofstream).
Цитата Сообщение от meJevin Посмотреть сообщение
Почему они кривые, как правильно их записать?
Они не кривые, они низкоуровневые. У стрингов под капотом указатель на текстовые данные. Вот write этот указатель на диск и записывает, а сами данные не трогает.
0
meJevin
158 / 150 / 92
Регистрация: 18.11.2015
Сообщений: 677
Завершенные тесты: 1
17.04.2016, 12:16  [ТС] 6
Renji, я не совсем понял, как мне без typeid определить, что делать. Если у меня ofstream объект, то программа записывает на файл, если у меня ostream объект cout, то просто вывести данные. Как это сделать не расходуя много строк кода?
0
Renji
2513 / 1719 / 515
Регистрация: 05.06.2014
Сообщений: 4,981
17.04.2016, 12:33 7
Цитата Сообщение от meJevin Посмотреть сообщение
Renji, я не совсем понял, как мне без typeid определить, что делать. Если у меня ofstream объект, то программа записывает на файл, если у меня ostream объект cout, то просто вывести данные.
Вы концепцию потоков не понимаете. ostream это абстрактный поток данных на деревню дедушке. И все эти read/write пишут именно дедушке, а не в файл. ofstream и cout - потомки ostream, у которых есть адрес дедушки (в файле/консоли). Вам надо писать данные в абстрактный ostream, потомок дальше сам разберется где его дедушка живет.
0
meJevin
158 / 150 / 92
Регистрация: 18.11.2015
Сообщений: 677
Завершенные тесты: 1
17.04.2016, 12:35  [ТС] 8
Renji, и вообще, зачем использовать read/write, когда они такие неудобные? Или как-то можно стринг записать через них?
0
Renji
2513 / 1719 / 515
Регистрация: 05.06.2014
Сообщений: 4,981
17.04.2016, 12:40 9
Цитата Сообщение от meJevin Посмотреть сообщение
Renji, и вообще, зачем использовать read/write, когда они такие неудобные? Или как-то можно стринг записать через них?
read/write для записи данных как они есть, все остальное перегоняет данные в текстовый формат. А стринги записываются ровно также как и в cout - os<<str<<endl;. Там вообще у любых двух потоков методы работы совпадают на 99% процентов, затем вся эта петрушка с абстрактными дедушками и затевалась.
0
meJevin
158 / 150 / 92
Регистрация: 18.11.2015
Сообщений: 677
Завершенные тесты: 1
17.04.2016, 12:46  [ТС] 10
Renji, хорошо, спасибо, я почитаю еще про потоки эти. Но все же, как мне без typeid понять, что делать? Там вообще не нужно это if else?
0
nmcf
6533 / 5757 / 2621
Регистрация: 14.04.2014
Сообщений: 24,494
17.04.2016, 12:47 11
Цитата Сообщение от meJevin Посмотреть сообщение
Или как-то можно стринг записать через них?
Можно, но тебе по заданию это не требуется.

Да не нужен этот typeid, идея в том, чтобы эта функция с любыми потоками работала. Просто используешь os/is.
0
Renji
2513 / 1719 / 515
Регистрация: 05.06.2014
Сообщений: 4,981
17.04.2016, 12:50 12
Цитата Сообщение от meJevin Посмотреть сообщение
Но все же, как мне без typeid понять, что делать? Там вообще не нужно это if else?
Вообще не нужно if else. Что делать с данными - головная боль ostream, а не operator<<. operator<< должен только пихать данные в ostream.
1
meJevin
158 / 150 / 92
Регистрация: 18.11.2015
Сообщений: 677
Завершенные тесты: 1
17.04.2016, 12:52  [ТС] 13
Renji, Понял, спасибо за помощь.
0
17.04.2016, 12:52
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.04.2016, 12:52

О перегрузке операторов
Вот у меня есть код программы : #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt;...

Ошибка в перегрузке operator=
Доброго времени суток! Компилятор ругается на перегрузку оператора присвоения. Задумывалось так,...

Ошибка в перегрузке операторов?
не могу понять в чем ошибка class cMatrix { private: int rows; int columns; public:


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

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

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