Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с файлами C++

88K
25 июня 2013 года
robust
5 / / 25.06.2013
Здравствуйте, никак не могу осилить файлы. Требуется выполнить вот такое задание:

В справочной автовокзала хранится расписание движения автобусов. Для каждого рейса указаны:
— номер рейса;
— тип автобуса;
— пункт назначения;
— время отправления и время прибытия на конечный пункт.
Вывести информацию о рейсах, которыми можно воспользоваться для прибытия в пункт назначения раньше заданного времени.

Помогите пожалуйста, очень нужно!
332
25 июня 2013 года
Valiant
416 / / 27.09.2004
Каким образом задача коррелируется с файлами?
88K
25 июня 2013 года
robust
5 / / 25.06.2013
Цитата: Valiant
Каким образом задача коррелируется с файлами?


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

332
27 июня 2013 года
Valiant
416 / / 27.09.2004
Открыть файл fopen()
Записать строку в файл fputs()
Прочитать строку из файла fgets()
Закрыть файл fclose()

На форуме есть примеры работы с массивами.
88K
27 июня 2013 года
robust
5 / / 25.06.2013
Цитата: Valiant
Открыть файл fopen()
Записать строку в файл fputs()
Прочитать строку из файла fgets()
Закрыть файл fclose()

На форуме есть примеры работы с массивами.



Вот чего я достиг:

Код:
struct infa
{
    int nomer;
    char tip[20];
    char punkt[20];
    int vr_ot, vr_pr;
} bf;

void show ()
{
cout <<"nomer: "<< bf.nomer << endl
<<"tip: "<< bf.tip << endl
<<"punkt: "<< bf.punkt << endl
<<"vremya ot: "<< bf.vr_ot << endl
<<"vremya pr: "<< bf.vr_pr << endl
<< "-------------------" << endl;
}  

void set ()
{
cout << "vvedite nomer: ";
cin >> bf.nomer;
cout << "vvedite tip: ";
cin >> bf.tip;
cout << "vvedite punkt: ";
cin >> bf.punkt;
cout << "vvedite vremya otpravleniya: ";
cin >> bf.vr_ot;
cout << "vvedite vremya pribitiya: ";
cin >> bf.vr_pr;
}

int main()
{
FILE *f;
if ( (f = fopen ("c:\\file.txt", "rb")) != 0 )               //создание чтение
      f = fopen ("c:\\file.txt", "ab+");                     //окрыть добав
else
      f = fopen ("c:\\file.txt", "wb+");                     // вывод

cout << "1 - zapishet infy\n2 - pokazat vsy infy\n3 - zadanie\n";
short int sel;
cin >> sel;
switch (sel)
    {
    case 1 :
    {
        int count;
        cout << "Kol-vo zapiseu\? :";
        cin >> count;
        for (int i=0; i<count; i++)
        {
            set();
            fwrite (&bf, sizeof(infa), 1, f);   // запись / чтение  __что именно__, _размер_ вычисляем размер - сумму всех полей __кол-во раз, куда- в файл.
        }
    }; break;

    case 2 :
    {
        while (feof(f) == 0)
        {
            fread (&bf, sizeof (infa), 1, f);
            show ();
        }
    }; break;

    case 3 :
    {
        int nomer;
        int vr_ot, vr_pr;
        char *tip = new char;
        char *punkt= new char;
        cout<<"vvedite punkt: "; cin>>punkt;
        cout<<"vvedite vremya pribitiya: "; cin>>vr_pr;
        fread(&bf, sizeof (infa), 1, f);
        while (feof(f) == 0)
        {
            fread(&bf, sizeof (infa), 1, f);
            if ( (punkt == bf.punkt) && (vr_pr < bf.vr_pr) )
            {
                nomer = bf.nomer;
                tip = bf.tip;
                punkt = bf.punkt;
                vr_ot = bf.vr_ot;
                vr_pr = bf.vr_pr;
            }    
        }
        cout << nomer << endl;
        cout << tip << endl;
        cout << punkt << endl;
        cout << vr_ot << endl;
        cout << vr_pr <<endl;
    }; break;
    }

system ("PAUSE");
return 0;
}
Прошу помочь с выполнением задания(это цифра 3). Я что-то не так делаю..
332
27 июня 2013 года
Valiant
416 / / 27.09.2004
массив символов не так сравнивается

 
Код:
if ( (strcmp(punkt, bf.punkt)==0) && (vr_pr < bf.vr_pr) )
а так же копирование

 
Код:
strcpy(punkt,bf.punkt);
При такой конструкции у Вас выводимых значений будет на одно больше (последнее значение выведется 2 раза)

 
Код:
while (feof(f) == 0)
        {
            fread (&bf, sizeof (infa), 1, f);
            show ();
        }
я бы в сделал так:

 
Код:
fseek (f, 0, SEEK_END);
        int fLen = ftell(f);
        fseek(f,0,SEEK_SET);
        for(int i=0;i<(fLen/sizeof(infa));i++){
            fread (&bf, sizeof (infa), 1, f);
            show ();
        }
88K
27 июня 2013 года
robust
5 / / 25.06.2013
Цитата: Valiant
массив символов не так сравнивается

 
Код:
if ( (strcmp(punkt, bf.punkt)==0) && (vr_pr < bf.vr_pr) )
а так же копирование

 
Код:
strcpy(punkt,bf.punkt);
При такой конструкции у Вас выводимых значений будет на одно больше (последнее значение выведется 2 раза)

 
Код:
while (feof(f) == 0)
        {
            fread (&bf, sizeof (infa), 1, f);
            show ();
        }
я бы в сделал так:

 
Код:
fseek (f, 0, SEEK_END);
        int fLen = ftell(f);
        fseek(f,0,SEEK_SET);
        for(int i=0;i<(fLen/sizeof(infa));i++){
            fread (&bf, sizeof (infa), 1, f);
            show ();
        }



Спасибо вам больше, всё отлично получилось :)

51K
02 июля 2013 года
BagiLR
110 / / 29.06.2013
1 = 1 = 1 + 2 = 3 * 3 = 9 - 2 = 7
добавить страницу массива по выполненным функциям для определения точного времени
51K
02 июля 2013 года
BagiLR
110 / / 29.06.2013
тут же добавить и скорость движения автобуса со скоростью 90 km\h
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог