Создание календаря напоминания

Ребят, помогите, надо сделать календарь напоминания в С++, кто может подскажите, сделайте...

Ты пиши, выкладывай код, описывай проблемы. Может кто и поможет.

// курсова календар.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <fstream>
using std::ofstream;
using std::ifstream;

#include <iostream>
using std::cout;
using std::cin;
using std::endl;
using std::cerr;
using std::ios;
using std::get;
#include <cstdlib>
#include <iomanip>
using std::setw;
using std::left;




class kalendar
{
    ofstream file;
    char data[20], event[255];
    int num,j;
public:
    kalendar()
    {
        file.open("kalendar1.txt",ios::app);
        if (!file) cout << "Ошибка открытия файла";
    }
    void menu()
    {
        system("cls");
        cerr << "1.Чтобы добавить новое напоминание нажмите \"1\"" << endl;
        cerr << "2.Чтобы найти напоминание по дате нажмите \"2\"" << endl;
        cerr << "3.Чтобы выйти нажмите \"3\"" << endl;
        cin >> num;
        switch (num)
        {
        case 1: {add();break;}
        case 2: {search();break;}
        case 3: {exit(1);break;}
        default:

            break;
        }

    }
    void add()
    {
        system("cls");
        cin.ignore();
        cout << "Введите дату (например: 01.11.2014):  ";
        cin.getline (data, 13);
        cout << "Ведите событие: ";
        cin.getline (event,255);
        file << setw(12) << left << data;
        file << setw(3) << left << event << ";" << '\n';
        menu();
    }
    void search()
    {
    ifstream file ("kalendar1.txt");
    cout << "Введите дату (например: 01.11.2014):  ";
    cin.ignore();
    cin.getline (data, 13);
    char *file_id= new char[sizeof(file)];
    file.getline(file_id,'\n');

    for (int i=0;i<strlen(file_id);i++)
        {
            if (data[0]==file_id[i])
            {
                cout << "ere";
                for (int k=0;k<10;k++)
                {
                    if (data[k]==file_id[i])
                    {
                        j++;
                    }
                    if (j>9) cout <<"good"; 
                }
            }
        }
    }

    ~kalendar()
    {
        file.close();
    }
};


int main()
{
    setlocale(LC_ALL, "Russian"); 
    kalendar obj;
    obj.menu();



    system("pause");
    return 0;
}

ввожу дату и событие запоминает его, хочу посмотреть событие — ввожу дату ето не пашет((

Вовка, не в обиду, такого бреда я давно не видел ((

Ошибки проектирования

(1) Не надо открывать файл для записи при создании экземпляра класса и закрывать его в деструкторе, поскольку этот файл так же используется и для чтения тем же экземпляром класса. Надо либо в конструкторе открывать файл на чтение и запись (файл с произвольным доступом) и закрывать в деструкторе, либо, что предпочтительнее, открывать и закрывать файл локально внутри методов, не используя член класса типа файлового потока.

(2) Не надо использовать рекурсию для организации циклов (вызов menu() из add(), вызванного из menu()).

(3) Код метода menu() надо перенести из класса в вызывающий код (в данном случае, в ф-цию main()) и поместить внутрь цикла.

(4) Из членов класса убрать переменные int num,j. Они там совершенно не нужны.

(5) Вместо «магических» чисел (20, 255, 13, 10) использовать именованные константы.

(6) Имя файла данных календаря оформить как строковую константу. И, желательно, убрать её из реализации класса, а передавать как параметр в конструктор.

(7) Не надо использовать функцию exit() для штатного завершения программы.

Ошибки кодирования

(1) Функция exit() немедленно завершает работу программы. При этом деструкторы объектов не отрабатываются. Следовательно, при последовательном выборе в меню пунктов «1» и «3» информация в файл записана не будет, т.к. вывод в файл буферизованный и запись последнего буфера будет производиться при закрытии файла (в деструкторе).

(2) В функции search() для чтения открывается файл, открытый для записи. В зависимости от компилятора и ОС, результат может быть самый разнообразный: от ошибки открытия файла, до невозможности прочесть последнюю внесённую запись. Кстати, успешность открытия файла для чтения ни где не проверяется.

(3) Угадать смысл в char *file_id= new char[sizeof(file)]; я так и не смог. Почему размер буфера для ввода текста из файла должен быть равен размеру экземпляра класса ifstream (252 байта)?

(4) В следующем операторе file.getline(file_id,'\n'); угадывается желание прочитать строку до ограничителя. Однако в STL имеется только две перегрузки для метода getline() класса basic_istream:

basic_istream<Elem, Tr>& getline(
    char_type *_Str, 
    streamsize _Count
);
basic_istream<Elem, Tr>& getline(
    char_type *_Str, 
    streamsize _Count, 
    char_type _Delim
);

Таким образом, в программе второй параметр неявно приводится к типу streamsize и используется первая форма перегруженной функции: только со счётчиком, но без символа-ограничителя. В данном случае, будет считано из файла 9 байт (1 байт резервируется для концевого '\0').

(5) Следующий далее фрагмент кода (до конца функции) не поддался моему осмыслению. Могу только отметить, что используется неинициализированная переменная j и не освобождается память для буфера file_id. Подозреваю, что здесь должен был бы быть код, который в цикле считывает записи из файла данных, проверяет совпадение даты с введённой пользователем и, в случае совпадения, выводит на экран «напоминание».

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.