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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Файл -> структура данных struct 
V
    Опции темы
Master_
Дата 14.3.2009, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

kuzmin              1999 2 13
prohorov            1999 4 24
shenok              1999 6 13
koshin              1990 1 46
bulatov             1989 8 51
alexeev             1991 6 12
lisov               1991 3 29

Пробовал по разному считать данные в структуру (read_file), но никак не получается. 
Код

#include <iostream>
#include <fstream>
#include <conio.h>
#include <string>
using namespace std;
struct student {
    char fam[20];
    int  year;
    char group[5];
    int  time;
    student* next;
};

typedef student* ptr;
ptr headptr;


void read_file()
{
    student p;
    int recordsRead;
    //p = headptr;
    FILE *file = fopen("list.txt", "rb");
    recordsRead = fread(&p,    sizeof(student),1,file);
    //cout << p[1].fam << " " << p[1].year;
    
    
    fclose(file);
    /*
        ptr p;
    p = headptr;
    ifstream fin;
    fin.open("list.txt", ifstream::in);
    
    //infile.getline(*p, sizeof(p));
    if ( !fin.is_open() ) return;
    //string str;
    for ( int i=0; i<6; i++ )
    {
        fin.read((char*) &p[i], sizeof p);
        cout<<p[i].fam<<" "<<p[i].year<<" "<<p[i].group<<p[i].time<<endl;
    }
    cin.get();
    */
    //while (infile.good())
    //    cout << (char) infile.get();
    /*char c;
    while (infile.good())     // loop while extraction from file is possible
    {
        c = infile.get();       // get character from file
        if (infile.good())
            cout << c;
    }*/
}

void read(student &stud)
{
    cout << "Фамилия: ";
    cin >> stud.fam;
    cout << "Год: "; 
    cin >> stud.year;
    cout << "Группа: "; 
    cin >> stud.group;
    cout << "Время: "; 
    cin >> stud.time;
}

int form_list()
{
    ptr p;
    char let;
    headptr=NULL;
    do
    {
        cout << "y-продолжить, n-завершиьт" << endl;
        let=_getch();
        if (let=='n')
            return 1;
        if (headptr==NULL)
        { 
            headptr=new student;
            p=headptr;
        }
        else
        {
            p->next=new student;
            p=p->next;
        }
        read(*p);
        p->next=NULL;
    } while (1);
}

void print(student stud)
{
    cout << stud.fam << " " << stud.year << " " << stud.group << " " << stud.time;
}

void print_list()
{
    ptr p;
    p=headptr;
    while (p!=NULL)
    {
        print(*p);
        p=p->next;
    }
}

int sort()
{
    ptr p1,p2,q1,q2,temp;
    if (headptr==NULL) 
        return 1;

    if (headptr->next==NULL) 
        return 1;

    p1=headptr;
    p2=NULL;
    while (p1->next!=NULL)
    {
        q1=p1->next;
        q2=p1;
        while (q1!=NULL)
        {
            if (strcmp(p1->fam, q1->fam)>0)
            {
                if (p1==q2)
                {
                    p1->next=q1->next;
                    q1->next=p1;
                    p1=q1;
                    q1=q2;
                    q2=q1;
                }
                else
                {
                    temp=p1->next;
                    p1->next=q1->next;
                    q1->next=temp;
                    temp=p1;
                    p1=q1;
                    q1=temp;
                    q2->next=q1;
                }
                if (p2==NULL) headptr=p1;
                else p2->next=p1;
            }
            q2=q1;
            q1=q1->next;
        };
        p2=p1;
        p1=p1->next;
    };
    return 0;
}

int main()
{
    setlocale( LC_ALL, "Russian" );
    read_file();
    //form_list();
    cout << "Список: " << endl;
    print_list();

    sort();
    cout << "Сортировка: " << endl;
    print_list();
    _getch();
    return 0;
}



Как сделать правильно?

Это сообщение отредактировал(а) Master_ - 14.3.2009, 00:18
PM   Вверх
Anikmar
Дата 14.3.2009, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



У вас файл в текстовом виде, а вы пытаетесь его как набор байт считать в структуру. Полчаете мусор, а что вы еще ожидали?
Вам нужно построчно считывать файл и из каждой строки уже выбирать значения полей структуры. 
Проще всего, пожалуй, задействовать стандартные потоковые функции С++.
PM MAIL ICQ   Вверх
Anikmar
Дата 14.3.2009, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Файл будете сами записывать или нужно парсить готовый текстовый?
PM MAIL ICQ   Вверх
Master_
Дата 14.3.2009, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Готовый - только чтение.
PM   Вверх
Anikmar
Дата 14.3.2009, 01:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Второй немаловажный момент: Если фамилия и имя будут через пробел, то тогда вам нужно будет как-то обозначить в файле конец строки. Это может быть либо символ разделитель, либо гарантированное форматирование по количеству символов.

Что касается вашего файла - то чтение его производится при помощи 5 строк кода:
Код

typedef struct _student{
    char fam[20];
    int  year;
    char group[5];
    int  time;
    struct _student *next;
} student;

void ReadFileStudents(void)
{
    student s;
    ifstream fin("input.txt");
    if (fin.is_open())
        while(!fin.eof())
        {
            fin >> s.fam >> s.year >> s.group >> s.time;
            cout << s.fam << " " << s.year << " " << s.group << " " << s.time << endl;
        }
    else cout << "Error open file" << endl;

}


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

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


Кодофей
****


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

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



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


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Master_
Дата 14.3.2009, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Пробую сделать печать списка после чтения из файла. 
Печатается только последний элемент. Как перейти на первый элемент структуры?
Код

void print(student stud)
{
    cout << stud.fam << " " << stud.year << " " << stud.group << " " << stud.time;
}
void print_list(student* p)
{
    //ptr p;
    //p=headptr;
    
    while (p!=NULL)
    {
        print(*p);
        p=p->next;
    }
}


Это сообщение отредактировал(а) Master_ - 14.3.2009, 12:57
PM   Вверх
Anikmar
Дата 14.3.2009, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Master_ @  14.3.2009,  12:57 Найти цитируемый пост)
Пробую сделать печать списка после чтения из файла. 
Печатается только последний элемент. Как перейти на первый элемент структуры?

Видимо передать в void print_list(student* p) адрес первого элемента.

Приведите код заполнения списка - так тяжело что-то сказать.
PM MAIL ICQ   Вверх
Master_
Дата 14.3.2009, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Сделал так, работает, но после печати ругается(функция print_list) , по-моему после последнего элемента Необработанное исключение в "0x00f11b79" в "14.exe": 0xC0000005: Нарушение прав доступа при чтении "0xcdcdcdcd".: 
Код

struct student {
    char fam[20];
    int  year;
    char group[5];
    int  time;
    student *next;
};
typedef student* ptr;
ptr headptr;

void read_file()
{
    ptr p;
    headptr=NULL;
    ifstream fin("list.txt");
    if (fin.is_open())
        while (!fin.eof())
        {
            if (!headptr)
            { 
                headptr=new student;
                p=headptr;
            }
            else
            {
                p->next=new student;
                p=p->next;
            }
            fin >> p->fam >> p->year >> p->group >> p->time;
            cout << p->fam << " " << p->year << " " << p->group << " " << p->time << endl;

        }
    else cout << "Не удалось открыть файл" << endl;
}
void print(student stud)
{
    cout << stud.fam << " " << stud.year << " " << stud.group << " " << stud.time << endl;
}

void print_list()
{
    //ptr p;
    //p=headptr;
    //p=&p[0];
    //student *p;
    ptr p;
    p=headptr;

    while (p!=NULL)
    {
        print(*p);
        p=p->next;
    }
}


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


Бывалый
*


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

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



Добавил после чтения из файла (конец ф-ии read_file()) в структуру next элемент со значинем null. Т.к. while (p!=NULL). 
Может есть способы получше?
Код

    p->next=new student;
    p=p->next=NULL;

PM   Вверх
Anikmar
Дата 14.3.2009, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Master_ @  14.3.2009,  13:46 Найти цитируемый пост)
Добавил после чтения из файла (конец ф-ии read_file()) в структуру next элемент со значинем null. Т.к. while (p!=NULL). 
Может есть способы получше?


Есть способы правильнее. У вас не ставится конечный NULL вот и вылетает
Код

            if (!headptr)
            { 
                headptr=new student;
//----------------------  Вставьте строку:
                headptr->next = NULL;
                p=headptr;
            }
            else
            {
                p->next=new student;
                p=p->next;
//----------------------  Вставьте строку:
                p->next = NULL;
            }


Добавлено через 46 секунд
Цитата(Master_ @  14.3.2009,  13:46 Найти цитируемый пост)
    p->next=new student;
    p=p->next=NULL;


А этого кода я не понял. Что вы хотели?
PM MAIL ICQ   Вверх
zim22
Дата 14.3.2009, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Master_, не проще std::list использовать?
всё равно у вас программа не сишная.


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


Эксперт
****


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

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



Цитата(zim22 @  14.3.2009,  14:04 Найти цитируемый пост)
Master_, не проще std::list использовать?
всё равно у вас программа не сишная.

Вы думаете эта программа обречена на какое-то практическое применение? Пусть человек потренируется.
PM MAIL ICQ   Вверх
inside_pointer
Дата 14.3.2009, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

    void print(student stud)

    print(*p);


лучше сделать

Код

    void print(student *stud)

    print(p);


так как в первом случае при каждом распечатывании структуры она сначала вся копируется в функцию, а потом эта копия распечатывается, а во втором передаётся её адрес (одно число) и потом распечатывается с этого адреса
при этом print станет такой

Код

void print(student *stud)
{
    cout << stud->fam << " " << stud->year << " " << stud->group << " " << stud->time << endl;
}

PM MAIL   Вверх
Master_
Дата 14.3.2009, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Спасибо за помощь.

Еще, может кто-нибудь знает, где бы посмотреть схемы работы со списками (деревьями) в виде примеров или еще чего-нибудь, а то мне нужно нарисовать схему сортировки, а как рисовать это в виде деревьев - не особо представляю
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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