Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Считывание обьектов из файла в масив 
:(
    Опции темы
flyleaf
Дата 22.5.2009, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 40
Регистрация: 6.4.2009

Репутация: нет
Всего: нет



Помогите плз со считыванием обьектов из файла и записью их в масив, при етом надо указать количество считаных обьектов и байтов и вывести все на экран!
Заносились данные в файл таким образом
Код

#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
#include <iomanip.h>
#include <conio.h>
#define MAX 80
#define ESC 27

class music
{
     char name[MAX];
     char albom[MAX];
     int year;
      public:
        music& operator =(const music& el);
        friend ostream& operator<<(ostream&,music);
        friend istream& operator>>(istream&,music&);
};

ostream& operator <<(ostream &stream, music el)
{
    cout<<setfill('.')<<setprecision(4)<<setiosflags(ios::showpoint | ios::fixed);
stream <<"name of artist: " <<el.name<<"\n";
stream <<"name of album: " <<el.albom<<"\n";
stream <<the year:" <<el.year<<"\n";
return cout;
}

istream& operator >>(istream &stream,music &el)
{
cout << "Enter the name of artist:\n ";
stream >>el.name;
cout << "Enter tha name of album:\n";
stream >>el.albom;
cout<<"Enter the year: \n";
stream >>el.year;
return stream;
}
music& music::operator =(const music& el)
{
    int i;
for (i=0;i<MAX;i++)
{
name[i]=el.name[i];
 albom[i]=el.albom[i];
}
 year=el.year;
 return *this;
}


int main()
{
  music a;
  int k;
  char temp;
  k=0;
     ofstream fout("test.txt");
   if(!fout) {
       cout<<"Error of create file!!\n";
       return 1;
   }
      cout<<"Ender data:\n" ;
      while(1) {
cin >>a;
 fout<<a;
 k=k+1;
cout <<"Continue?(ESC - no) \n";
temp=getch();
if (temp==ESC) break;
}
   cout<<"size of file is  "<<sizeof(fout)<<"\n";
   cout<<k<<" objects in file!\n";
   fout.close();

      return 0;
    }




пробывала считывать таким способом --->
Код

  music b[20];
  int k,i;
  k=0;
     ifstream in("test.txt");
     if(!in) {
         cout<<"Open file eror!\n";
         return 1;
     }
     i=0;
while(!in.eof())
{
in.read((char *) &b,sizeof(music));
cout<<b[i];
i++;
}
in.close();
cout<<k<<" objects was create!\n";


PM MAIL ICQ   Вверх
bsa
Дата 22.5.2009, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



тебе точно нужно использовать текстовое представление данных?
Если не сложно, выложи пример файла (только не очень большой), который нужно считывать.
PM   Вверх
flyleaf
Дата 22.5.2009, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 40
Регистрация: 6.4.2009

Репутация: нет
Всего: нет



Канешь не сложно!

Код

name of artist: 1
name of album: 1
the year: 1
name of artist: 2
name of album: 2
the year: 2
name of artist: 3
name of album: 3
the year: 3
name of artist: 4
name of album: 4
the year: 4
name of artist: 5
name of album: 5
the year: 5


ну всесто циферок можно че угодно канешь
при считывание я брала клас с 3-а тектовыми переменными
ето две отдельные програмки, одна записывает, вторая должна ситывать
Код

class music
{   public:
     char name[MAX];
     char albom[MAX];
    char year[MAX];
        music& operator =(const music& el);
        friend ostream& operator<<(ostream&,music);
        friend istream& operator>>(istream&,music&);
};


Это сообщение отредактировал(а) flyleaf - 22.5.2009, 22:01
PM MAIL ICQ   Вверх
azesmcar
Дата 22.5.2009, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



flyleaf

Цитата

name of artist

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

Код

struct info
{
    std::string aname;
    std::string album;
    std::string ayear;
};

std::istream& operator >> (std::istream& inc, info& tinf)
{
    std::string temp;
    for (int i = 0; i < 3; ++i)
    {
        getline(inc, temp);
        if (!temp.empty())
        {
            switch (i)
            {
            case 0: tinf.aname = temp.substr(16); break;
            case 1: tinf.album = temp.substr(15); break;
            case 2: tinf.ayear = temp.substr(10); break;
            }
        }
    }
    return inc;
}

int main()
{
    std::ifstream fstr("c:\\1.txt");
    std::vector<info> vec((std::istream_iterator<info>(fstr)), (std::istream_iterator<info>()));
    //...
}


Это сообщение отредактировал(а) azesmcar - 22.5.2009, 22:27
PM   Вверх
flyleaf
Дата 22.5.2009, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 40
Регистрация: 6.4.2009

Репутация: нет
Всего: нет



Насчет задания, лаба есть лаба(((
а насчет текста, так мне надо в масив заносить ето( и выводить размер считаного.
причем без использования СТЛ =( поетому проблема пока что остается (

PM MAIL ICQ   Вверх
azesmcar
Дата 23.5.2009, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(flyleaf @  22.5.2009,  22:46 Найти цитируемый пост)
а насчет текста, так мне надо в масив заносить ето( и выводить размер считаного.

Ну так занесено в вектор, можете выводить
std::cout << vec.size();

Цитата(flyleaf @  22.5.2009,  22:46 Найти цитируемый пост)
причем без использования СТЛ =( поетому проблема пока что остается (

А вот это уже слишком..и почему же?
1. не знач количество строк в файле вы не сможете создать массив, придеться либо два раза файл считывать, либо самой вектор писать
2. зачем писать задачи заведомо неправильно? учат людей в институте непонятно чему.

Код

#include <iostream>
#include <string>
#include <fstream>

struct info
{
    std::string aname;
    std::string album;
    std::string ayear;
};

std::istream& operator >> (std::istream& inc, info& tinf)
{
    std::string temp;
    for (int i = 0; i < 3; ++i)
    {
        getline(inc, temp);
        if (!temp.empty())
        {
            switch (i)
            {
            case 0: tinf.aname = temp.substr(16); break;
            case 1: tinf.album = temp.substr(15); break;
            case 2:    tinf.ayear = temp.substr(10); break;
            }
        }
    }
    return inc;
}

int main()
{
    std::ifstream fstr("c:\\1.txt");
    std::string temp;

    int n = 0;
    while (getline(fstr, temp))
        ++n;

    n /= 3;

    info* vec = new info[n];
    for (int i = 0; i < n; ++i)
    {
        fstr >> vec[n];
    }
    std::cout << n << std::endl;
    delete [] vec;
}

Что-то похожее на это безобразие нужно? smile 
правда я тут никаких проверок не неправильный формат файла не писал..это вы уж посмотрите..надо/не надо..
PM   Вверх
zim22
Дата 23.5.2009, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(azesmcar @  23.5.2009,  08:58 Найти цитируемый пост)
1. не знач количество строк в файле вы не сможете создать массив, придеться либо два раза файл считывать, либо самой вектор писать

можно вместо массива в список заносить значения. а в конце создать динамический массив, равный размеру списка и скопировать туда элементы.
не такой уж вектор и сложный. строк 50 кода.




--------------------
PM MAIL   Вверх
azesmcar
Дата 23.5.2009, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(zim22 @  23.5.2009,  09:13 Найти цитируемый пост)
можно вместо массива в список заносить значения. а в конце создать динамический массив, равный размеру списка и скопировать туда элементы.

в какой список? std::list имеется ввиду? STL использовать нельзя. 

Цитата(zim22 @  23.5.2009,  09:13 Найти цитируемый пост)
не такой уж вектор и сложный. строк 50 кода.

А где я говорил что он сложный? меня скорее интересует вопрос - зачем писать то что давно написано и причем не просто "где-то написано" а является частью стандартной библиотеки шаблонов C++.
PM   Вверх
zim22
Дата 23.5.2009, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(azesmcar @  23.5.2009,  09:22 Найти цитируемый пост)
в какой список? 

самописно-велосипедный.

Цитата(azesmcar @  23.5.2009,  09:22 Найти цитируемый пост)
 - зачем писать то что давно написано

stl же использовать нельзя. поэтому остаётся вариант или написать самому или дать преподу в глаз.

Вот нашёл велосипед smile
Сначала вариант с allocator использовал, но вдруг преподу не понравится - поэтому заменил на более низкоуровневые операции работы с памятью.
Код

#include <memory>
#include <vector>
#include <algorithm>

template <class T>
class Vector {
public:  
  typedef T* iterator;
  iterator beg_it;
  iterator end_it;

  Vector() : elements(0), first_free(0), end(0), 
    beg_it(elements), end_it(first_free) { }
  T &operator[](size_t pos) { return elements[pos]; }
  const T &operator[](size_t pos) const { return elements[pos]; }
  void push_back(const T&);
  void reserve(size_t);
  void resize(size_t);
  void resize(size_t, const T&);
  size_t capacity() const;
  size_t size() const {
    return first_free - elements;
  }

private:    
  //static std::allocator<T> alloc;
  void reallocate();
  T* elements;
  T* first_free;
  T* end;    
};
template <class T>
void Vector<T>::resize(size_t newSize, const T &defaultValue)
{
  ptrdiff_t size = first_free - elements;
  if (size == newSize) return;
  if (newSize > size)
    for (int i = size; i != newSize; ++i) push_back(defaultValue);  
}

template <class T>
void Vector<T>::resize(size_t newSize)
{
  ptrdiff_t size = first_free - elements;
  if (size == newSize) return;
  if (newSize > size) {
    for (int i = size; i != newSize; ++i) push_back(T());
  }
}
template <class T>
void Vector<T>::reserve(size_t count)
{
  ptrdiff_t size = first_free - elements;  

  //T* newelements = alloc.allocate(size + count);
  T* newelements = static_cast<T*>(operator new[]((size + count) * sizeof(T)));  
  //std::uninitialized_copy(elements, first_free, newelements);  
  for (int i = 0; i != size; ++i)
    new(newelements + i) T(elements[i]);

  for (T *p = first_free; p != elements; /* empty */)
    //alloc.destroy(--p);
    (--p)->~T();    

  operator delete[](elements);
  //if (elements) alloc.deallocate(elements, end - elements);

  elements = newelements;
  first_free = elements + size;
  end = elements + size + count;

}
template <class T>
size_t Vector<T>::capacity() const
{
  return (end - first_free);

}
//template <class T>
//std::allocator<T> Vector<T>::alloc;

template <class T>
void Vector<T>::push_back(const T& t)
{
  if (first_free == end) reallocate();
  //alloc.construct(first_free, t);
  new(first_free) T(t);
  end_it = ++first_free;
}

template <class T>
void Vector<T>::reallocate()
{
  ptrdiff_t size = first_free - elements;
  ptrdiff_t newcapacity = 2 * std::max(size, 1);

  //T* newelements = alloc.allocate(newcapacity);
  T* newelements = static_cast<T*>(operator new[](newcapacity * sizeof(T)));
  //std::uninitialized_copy(elements, first_free, newelements);
  for (int i = 0; i != size; ++i)
    new(newelements + i) T(elements[i]);

  for (T *p = first_free; p != elements; /* empty */) {
    //alloc.destroy(--p);
    (--p)->~T();    
  }
  operator delete[](elements);

  //if (elements) alloc.deallocate(elements, end - elements);
  

  elements = newelements;
  first_free = elements + size;
  end = elements + newcapacity;

  beg_it = elements;
  end_it = first_free;
}

int main()
{
  Vector<std::string> v;
  v.push_back("hello");
  v.push_back("my");
  int s = v.size();
  v.push_back("dear");
  s = v.size();
    return 0;
}



--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1241 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.