Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.10.2014, 11:53   #11
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Цитата:
Сообщение от igoreshka3333 Посмотреть сообщение
1) То есть, под "форматированием данных" надо подразумевать перегрузку операторов << и >>?
Для начала покажите пример с перезагрузкой << и >>. От этого будем танцевать

Цитата:
Сообщение от igoreshka3333 Посмотреть сообщение
Код:
Создайте класс name. Создайте методы для этого класса,осуществляющие 
файловый ввод/вывод данных указанного класса (с использованием ofstream и ifstream).
 Используйте форматирование данных (операторы << и >>). Функции чтения и записи 
должны быть независимыми: в них необходимо внести выражения для открытия 
соответствующего потока, а также чтения и записи данных.
1) То есть, под "форматированием данных" надо подразумевать перегрузку операторов << и >>?
2) Функции чтения и записи сделать методами и назвать write () и read()?
Вообще-то в вашем задании я не вижу ни слова о перезагрузки << и >>

Скорее всего, имеется ввиду, что, например, в функции записи будет такой код:

Код:
file << "First Name: " << firstName << "\n";
То есть "форматирование" - это вывод в определённом формате. Ну и ввод тоже. Ваша программа "узнаёт свой файл" так как знает "что где стоит"

Но перезагрузить операторы << и >> всё же стоит. Тогда вы сможете в main() написать:

Код:
Person ivan( "Ivan", "Petrov" );
file << ivan << "\n";
Это всё творческая работа. Вы хозяин решения, поэтому всё будет так, как вы сами захотите. Мы просто даём советы, исходя из собственного опыта

Последний раз редактировалось Stilet; 07.10.2014 в 12:23.
8Observer8 вне форума Ответить с цитированием
Старый 07.10.2014, 13:02   #12
igoreshka3333
Форумчанин
 
Аватар для igoreshka3333
 
Регистрация: 26.09.2014
Сообщений: 176
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение

P.S. Не всё сразу, потом ещё напишу. Пока эту информацию переварите. Вопросов побольше задавайте
У меня как раз следующая тема "Многофайловые программы"! Вопросы, думаю, обязательно появятся)

Вот что у меня вышло!
Код:
#include <iostream>
#include <fstream>
#include <process.h>
using namespace std;
const int MAX = 10;
const int LEN = 10;

class Name
{
  private:
    char name [LEN];
    char surname [LEN];
    int age;
    static int n;
    static Name* arname [];
  public:
    void getName (){
      cout << "\nEnter the name: "; cin >> name;
      cout << "Enter the surname: "; cin >> surname;
      cout << "Enter the age of the person: "; cin >> age;
      }
    void showName (){
      cout << "\nName: " << name;
      cout << "\nSurname: " << surname;
      cout << "\nAge: " << age;
      }
    static void add ();
    static void diskIn ();
    static void diskOut (int);
};

int Name::n;
Name* Name::arname[MAX];
//-----------------------------------------------------------
void Name::add ()
{
  arname[++n] = new Name;
  arname[n]->getName();
}
//-----------------------------------------------------------
void Name::diskIn ()
{
  ofstream ofile;
  ofile.open("EX.TXT", ios::trunc);
  if (!ofile) cout << "\nThe file can not be opened!";
  cout <<"\nThere is a record of " << n <<" men!\n";
  for (int i=0; i<n; i++){
    arname[i] = new Name;
    ofile << arname[i]->name << ' '
         << arname[i]->surname << ' '
         << arname[i]->age;
  }
  ofile.close();
}
//-----------------------------------------------------------
void Name::diskOut (int t)
{
  ifstream ifile;
  ifile.open("EX.TXT");
  if (!ifile) cout << "\nThe file can not be opened!";
  cout << "\nThere is reading of the " << t << " man!\n";
  arname[t-1] = new Name;
  ifile >> arname[t-1]->name >> arname[t-1]->surname >> arname[t-1]->age;
  cout << arname[t-1]->name << endl
       << arname[t-1]->surname << endl
       << arname[t-1]->age;
  arname[t-1]->showName();
}
//-----------------------------------------------------------
int main ()
{
  Name N;
  int ch;
  int number;
  while (true){
    cout << "Choose an action: \n1)Enter information;\n"
         << "2)Write information to a file;\n"
         << "3)Read information from a file;\n"
         << "4)Exit;\n";
    cin >> ch;
    switch (ch){
      case 1: N.add(); break;
      case 2: Name::diskIn (); break;
      case 3:{
      cout << "\nNumber of man: ";
      cin >> number; Name::diskOut (number); break;
      }
    case 4: exit (1);
    }
  }
  return 0;
}
Но с записью проблемка! Что бы я не вбивал в метод add() на экран выводится (да и в файле) вот эта запись
(Yh2(Yh2 0

Последний раз редактировалось Stilet; 07.10.2014 в 15:13.
igoreshka3333 вне форума Ответить с цитированием
Старый 07.10.2014, 14:34   #13
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

igoreshka3333, хотите фокус покажу?

Вот я беру ваш код из вашего первого сообдения

Копирую его к себе в среду с моими настройками форматирования. И в одно мгновение получаю код, который намного приятнее читать:

Код:
#include <iostream>
using namespace std;

class Time {
private:
    int hour;
    int min;
    int sec;
public:
    void get_time( );

    void show_time( )
    {
        cout << '\n' << hour << ' : ' << min << ' : ' << sec;
    }

    bool isHour( int t )
    {
        if ( t < 0 || t > 23 )
            return 0;
    }

    bool isMinSec( int t )
    {
        if ( t < 0 || t > 59 ) return 0;
    }
};
//----------------------------------------------------

void Time::get_time( )
{
    Time t;
    while ( true ) {
        cout << "\nVvedite chasy: ";
        cin.unsetf( ios::skipws );
        cin >> t.hour;
        int ti = t.hour;
        if ( isHour( ti ) && cin.good( ) ) {
            cin.ignore( 10, '\n' );
            break;
        }
        cin.clear( );
        cin.ignore( 10, '\n' );
        cout << "Nevernyi format!!!";
    }
    while ( true ) {
        cout << "Vvedite minuty: ";
        cin.unsetf( ios::skipws );
        cin >> t.min;
        int mi = t.min;
        if ( isMinSec( mi ) && cin.good( ) ) {
            cin.ignore( 10, '\n' );
            break;
        }
        cin.clear( );
        cin.ignore( 10, '\n' );
        cout << "\nNe pravil'nyi format vremeni!";
    }
    while ( true ) {
        cout << "Vvedite minuty: ";
        cin.unsetf( ios::skipws );
        cin >> t.sec;
        int se = t.sec;
        if ( isMinSec( se ) && cin.good( ) ) {
            cin.ignore( 10, '\n' );
            break;
        }
        cin.clear( );
        cin.ignore( 10, '\n' );
        cout << "\nNe pravil'nyi format vremeni!";
    }
}
//-----------------------------------------------------

int main( )
{
    Time t;
    t.get_time( );
    t.show_time( );
    cout << endl;
    system( "pause" );
    return 0;
}
8Observer8 вне форума Ответить с цитированием
Старый 07.10.2014, 14:49   #14
igoreshka3333
Форумчанин
 
Аватар для igoreshka3333
 
Регистрация: 26.09.2014
Сообщений: 176
По умолчанию

8Observer8, спасибо Вам большое за советы. Я понял, что можно разбить на файлы и использовать один и тот же шаблон для облегчения чтения кода, как - то отформатировать в среде, но пока не хочу на этом зацикливаться, тем более, что базовые классы у меня всегда отличаются! И хотелось бы сейчас пока с потоками расправиться...

Последний раз редактировалось igoreshka3333; 07.10.2014 в 14:56.
igoreshka3333 вне форума Ответить с цитированием
Старый 07.10.2014, 14:59   #15
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

А где там разбиение на файлы? Я про форматирование кода

Цитата:
Но с записью проблемка! Что бы я не вбивал в метод add() на экран выводится (да и в файле) вот эта запись
(Yh2(Yh2 0
В коде ниже вы создаёте объект из кучи у которого ещё пустые поля "name", "surname", "age"
Код:
    for ( int i = 0; i < n; i++ ) {
        arname[i] = new Name;
        ofile << arname[i]->name << ' '
              << arname[i]->surname << ' '
              << arname[i]->age;
    }
Я тоже не сразу это нашёл, просто поставил точку останова и пошагам пошёл до этого места
8Observer8 вне форума Ответить с цитированием
Старый 07.10.2014, 15:17   #16
igoreshka3333
Форумчанин
 
Аватар для igoreshka3333
 
Регистрация: 26.09.2014
Сообщений: 176
По умолчанию

А... Прошу прощения! Понял о чем Вы) Ну у меня Qt конечно есть, но пока очень дико ним пользоваться после моего старенького Борланд Билдера 6.0 У Вас я так понял Кют?
Я немного не понял насчет Вашего замечания: я же вроде поля в add () заполнил в кучу (как я понял: занес одновременно в поля пообьектно, а обьекты одновременно заносятся в кучу), а потом из кучи вывожу нужный обьект?...

Последний раз редактировалось igoreshka3333; 07.10.2014 в 15:30.
igoreshka3333 вне форума Ответить с цитированием
Старый 07.10.2014, 16:08   #17
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Цитата:
Сообщение от igoreshka3333 Посмотреть сообщение
А... Прошу прощения! Понял о чем Вы) Ну у меня Qt конечно есть, но пока очень дико ним пользоваться после моего старенького Борланд Билдера 6.0 У Вас я так понял Кют?
Да, в Qt, чтобы отформатировань код надо его выделить и нажать Ctrl+I. Правда там нетонкая настройка, всяких этих скобочек. А вот в Netbeans - очень тонкая настройка, я его использую для форматирования. Копирую в Netbeans код, форматирую его (Shift+Alt+F), и копирую обратно в Qt Creator

Цитата:
Сообщение от igoreshka3333 Посмотреть сообщение
Я немного не понял насчет Вашего замечания: я же вроде поля в add () заполнил в кучу (как я понял: занес одновременно в поля пообьектно, а обьекты одновременно заносятся в кучу), а потом из кучи вывожу нужный обьект?...
Куча - это свободная память. Ваша программа запрашивает кусок памяти с помощью оператора new. Операционная система отдаёт указатель на этот кусок. Переменные объекта инициализируется в конструкторе

Что выведет программа в следующем примере?
Код:

#include <iostream>

#define MAX 10

class Person
{
public:
    char name[MAX];
};

int main()
{
    Person *p = new Person;
    std::cout << p->name << std::endl;

    return 0;
}
Обратите внимание на эту строку:
Код:
arname[i] = new Name;

Последний раз редактировалось Stilet; 18.10.2014 в 11:22.
8Observer8 вне форума Ответить с цитированием
Старый 07.10.2014, 16:20   #18
igoreshka3333
Форумчанин
 
Аватар для igoreshka3333
 
Регистрация: 26.09.2014
Сообщений: 176
По умолчанию

Адрес начала массива!
igoreshka3333 вне форума Ответить с цитированием
Старый 07.10.2014, 16:30   #19
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Код:
arname[i] = new Name;
Справа создаётся новый объект. Оператор new возвращает указатель на этот объект

Очевидно, что у нового объекта поля не инициализированны

Последний раз редактировалось Stilet; 07.10.2014 в 21:09.
8Observer8 вне форума Ответить с цитированием
Старый 07.10.2014, 16:56   #20
igoreshka3333
Форумчанин
 
Аватар для igoreshka3333
 
Регистрация: 26.09.2014
Сообщений: 176
По умолчанию

Я понял) Спасибо!
в add () я один раз должен выделить под массив указателей память, а дальше просто кидать туда обьекты!
igoreshka3333 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
описать класс в с# volkodinocka Помощь студентам 0 09.11.2013 22:05
Описать класс С# NeoX_2011 Помощь студентам 1 19.03.2012 00:10
C# исправление ошибки. Описать класс, реализующий шестнадцатеричный счетчик PROkaZZZniK Помощь студентам 7 09.02.2012 16:29
Описать класс-родитель и класс-потомок. Delphi 7 Andrew_M Помощь студентам 0 15.01.2011 14:42
Описать класс. Telec Общие вопросы C/C++ 1 30.04.2010 18:43