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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Массив Структур из файла 
V
    Опции темы
DominiK
Дата 12.11.2007, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 11.3.2007
Где: Россия, Омск

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



Запись
Код

#include <iostream>
using namespace std;
#include <windows.h>

typedef struct _pol
{
    char pol;
}pol;
typedef struct _name
{
    char name[25];
    char fam[25];
}name;
typedef struct _date
{
    int day;
    int month;
    int year;
}date;
typedef struct _anketa
{
    date dateStr;
    name nameStr;
    pol P;

}anketa;

typedef struct _size
{
    int size;
}size;



void main()
{

FILE *base = fopen("E:\\base.txt","wb");
int count;

    cout<<"Koll-vo chelovek: \n";
    cin>>count;

anketa *a = new anketa[count];
size s;

s.size = count;


for(int i = 0; i < count; i ++)
    {
        cout<<"Enter Imya "<<i+1<<" Cheloveka\n";
        cin>>a[i].nameStr.name;
        cout<<"Enter Familiy "<<i+1<<" Cheloveka\n";
        cin>>a[i].nameStr.fam;
        cout<<"Enter Pol(m,g) "<<i+1<<" Cheloveka\n";
        cin>>a[i].P.pol;
        cout<<"Enter DatyRojdenia(Den) "<<i+1<<" Cheloveka\n";
        cin>>a[i].dateStr.day;
        cout<<"Enter DatyRojdenia(Mesyac 1-12) "<<i+1<<" Cheloveka\n";
        cin>>a[i].dateStr.month;
        cout<<"Enter DatyRojdenia(year) "<<i+1<<" Cheloveka\n";
        cin>>a[i].dateStr.year;
    
        
    }

        fwrite(&s,sizeof(s),1,base);
        fwrite(&a,sizeof(a),1,base);






fclose(base);
system("pause");



}





Чтение
Код

#include <iostream>
using namespace std;
#include <fstream>
#include <windows.h>

typedef struct _pol
{
    char pol;
}pol;

typedef struct _name
{
    char name[25];
    char fam[25];
}name;

typedef struct _date
{
    int day;
    int month;
    int year;
}date;

typedef struct _anketa
{
    date dateStr;
    name nameStr;
    pol P;

}anketa;

typedef struct _size
{
    int size;
}size;

void main()
{
    
    size z;
    FILE *base = fopen("E:\\base.txt","rb");
    

    fread(&z,sizeof(z),1,base);
    cout<<"SIZE: "<<z.size<<"\n";

 


 anketa *a = new anketa[z.size];
 fread(&a,sizeof(a),1,base);
 




for (int i = 0; i < z.size; i++)
{
    
    cout<<"Familiya "<<i<<"cheloveka :\n";
    cout<<a[i].nameStr.fam<<"\n";
    cout<<"Imya "<<i<<"cheloveka :\n";
    cout<<a[i].nameStr.name<<"\n";




}


system("pause");

}



Не читает, всё пустое.
Если пишу и считываю не массив, а 1 структуру. То всё ок.  smile 
PM MAIL   Вверх
Daevaorn
Дата 12.11.2007, 02:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Зачем использовать конструкцию
Код

typedef _name {
//...
}name;

в С++?
И почему объявления структур не вынесены в отдельный заголовок? Copy/paste корень всех ошибок.
main должна возвращять int
Ну и наконец по теме: отлаживать пробовал?
PM MAIL WWW   Вверх
orthrus
Дата 12.11.2007, 07:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 400
Регистрация: 30.10.2007
Где: г. Усть-Илимск(Ир кутская обл.)

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



поменяйте в программах fwrite(&a,sizeof(a),1,base) на fwrite(a,sizeof(a[count-1]),1,base).


--------------------
У того, кто ничего не делает, всегда много помощников.© Л.Н. Толстой
user posted image
PM MAIL ICQ   Вверх
DominiK
Дата 12.11.2007, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 11.3.2007
Где: Россия, Омск

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



Цитата(Daevaorn @ 12.11.2007,  02:04)
Зачем использовать конструкцию
Код

typedef _name {
//...
}name;

в С++?
И почему объявления структур не вынесены в отдельный заголовок? Copy/paste корень всех ошибок.
main должна возвращять int
Ну и наконец по теме: отлаживать пробовал?

Чел, я это всё делал в 2 часа ночи, мне была важна тогда только работоспособность,а порядок я бы позже навел. Не себе делаю smile 


поменяйте в программах fwrite(&a,sizeof(a),1,base) на fwrite(a,sizeof(a[count-1]),1,base).

Считывает теперь только первые елементы(a[0] ...), дальше глухо. smile 
Почему -1?


Это сообщение отредактировал(а) DominiK - 12.11.2007, 10:34
PM MAIL   Вверх
Ln78
Дата 12.11.2007, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 25.11.2006

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



Цитата(DominiK @  12.11.2007,  01:56 Найти цитируемый пост)
 anketa *a = new anketa[z.size];
 fread(&a,sizeof(a),1,base);

sizeof от указателя 2, 4 или 8 байт
PM MAIL   Вверх
DominiK
Дата 12.11.2007, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 11.3.2007
Где: Россия, Омск

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



Цитата(Ln78 @ 12.11.2007,  10:33)
Цитата(DominiK @  12.11.2007,  01:56 Найти цитируемый пост)
 anketa *a = new anketa[z.size];
 fread(&a,sizeof(a),1,base);

sizeof от указателя 2, 4 или 8 байт

Ага пробаранил.


fread(a,sizeof(a[z.size]),1,base); || fread(a,sizeof(a[z.size - 1]),1,base); считываются только a[0] елементы. smile 

Возможно это из за того что если z.size = 2, то он и считывает как sizeof(a[2]), тоесть как размер 1 елемента массива.  smile  

Это сообщение отредактировал(а) DominiK - 12.11.2007, 10:48
PM MAIL   Вверх
Ln78
Дата 12.11.2007, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 25.11.2006

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



Так напиши
fread(a,sizeof(a[0]),z.size,base); 
или что нибудь в этом духе. Если хочешь, чтобы количество равнялось 1, можешь умножить во втором параметре:
fread(a,sizeof(a[0])*z.size,1,base); 

PM MAIL   Вверх
DominiK
Дата 12.11.2007, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 11.3.2007
Где: Россия, Омск

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



Цитата(Ln78 @ 12.11.2007,  10:47)
Так напиши
fread(a,sizeof(a[0]),z.size,base); 
или что нибудь в этом духе. Если хочешь, чтобы количество равнялось 1, можешь умножить во втором параметре:
fread(a,sizeof(a[0])*z.size,1,base);

написал...так же песня... smile 
щас в write так сделаю

Добавлено через 1 минуту и 56 секунд
Да, так и нужно. Тема закрыта  smile 

Это сообщение отредактировал(а) DominiK - 12.11.2007, 10:51
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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