Форум программистов, компьютерный форум CyberForum.ru

Буферизованный ввод в файл - C++

Восстановить пароль Регистрация
 
oinari
 Аватар для oinari
5 / 5 / 0
Регистрация: 18.10.2009
Сообщений: 69
12.05.2010, 20:17     Буферизованный ввод в файл #1
Доброго времени суток.
Нужна помощь с программой, для начала что она делает и в чём "соль":
1) создаёт файл на жд с именем ...
C++
1
const char * file_name = "information.txt"; //имя файла
конечно имя файла может быть любым но это так, хочу услышать замечание по этому поводу.
2) далее, мы должны ввести количество учеников в классе (глобально для этого я создал шаблон структуры)
3) отступление: я вырезал из программы "лишние" функции, оставил только проблемные (их 3)
4) ввод в файл структур должен быть буферизирован, я его "кидаю пачками" по 5
C++
1
#define F_buf 5 //файловый буфер
Итак, я смотрю делится ли
C++
1
cin >> sum; //ввод
нацело на 5, если да, то вызываю функцию create_db_ch, если нет то create_db_ch и create_db_not_ch, допустим ввели sum(16), первая функция в цикле заполнит первую партию по 5, кинет в файл, потом ещё раз 5 и ещё раз, итого 3, вызовется вторая функция и заполнит в цикле структуру 1 раз. Как-то так.
п.с. код длинный, надо бы сократить и доработать функции, может даже сделать это в одной функции Create_db, но я не знаю как. Кто, чем может прошу помочь...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
//----------------------------------------
#include "stdafx.h" //шаблон MVS
#include <iostream> //можно явно не включать
#include <fstream> //подключение заголовочного файла fstream, для работы с файлами I/O
#include <stdio.h> //STD I/O
#include <conio.h> 
using namespace std; //подключение пространства имён std
//----------------------------------------
#define def_file "MENU\n1. Create database\n2. Exit\nEnter item of the menu: " //меню 1
#define def_menu "MENU\n1. Create database\n2. View database\n3. Edit information\n4. Search information\n5. Remove database\n6. Exit\nEnter item of the menu: " //меню 2
 
#define F_buf 5 //файловый буфер
//----------------------------------------
typedef struct //объявление структуры, пользовательский тип
{ //список типов данных
    char family[15]; //фамилия; оператор объявления
    unsigned short school_class; //класс
    char year_of_birth[5]; //год рождения ученика
} type_information; // ; - завершает объявление шаблона
const char * file_name = "information.txt"; //имя файла
//----------------------------------------
//прототипы функций
int Create_db(FILE *); //создание
 
int View_db(FILE *); //просмотр
 
 
int create_db_ch(FILE *, unsigned int); //буфер "чётности"
int create_db_not_ch(FILE * f, unsigned int); //допольнительный буфер
//----------------------------------------
int main() //главная функция, возвращает 0 при успехе
{
    FILE * f; //объявление указателя на файл (f)
    unsigned short choice; //переменная "выбора"
    while(true) //условие работы опереатора switch (циклически)
    {
        system("CLS"); //очистка консоли, экрана
        if ( 0 == (f=fopen(file_name, "r")) )  //проверка на существование файла
        {       
            cout << def_file; //описание смотри в макроопределиниях (выше)      
            cin >> choice;
                switch(choice)
                {
                    case 1 : Create_db(f); break; //create db
                    case 2 : exit(1); //выход из программы
                    default : cout << "\nWatch the pressed keys!\n> ";          
                }
        }   
        else //файл уже есть!
        {
            fclose(f);
            cout << def_menu; //описание смотри в макроопределениях (выше)
            cin >> choice;
            switch(choice)
            {
                
                case 2 : View_db(f); break;
                
                case 5 : remove(file_name); break; //удаление файла
                case 6 : exit(1); //выход из программы
                default : cout << "\nWatch the pressed keys!\n> "; 
            }       
        }
    }   
    return 0;
}
//----------------------------------------
int create_db_ch(FILE * f, unsigned int a)
{
    f=fopen(file_name, "w"); //создание нового файла
    type_information * p = new type_information[F_buf]; //выделение памяти под динамический массив
    for (unsigned int i=0; i<a; i++)
    {
        cout << "\nInput structure.\nInput family: ";
        gets((p+i)->family);
        cout << "Input school class (format-number : x) : ";
        cin >> (p+i)->school_class;
        cout << "Input year of birth (format-number : xxxx) : ";
        gets((p+i)->year_of_birth);
    } 
    fwrite(p, sizeof(type_information), F_buf, f);
    delete [] p; //освобождение памяти
    fclose(f); //закрытие файла
    return 0;
}
//----------------------------------------
int create_db_not_ch(FILE * f, unsigned int b)
{
    f=fopen(file_name, "a"); //открытие на дозапись
    type_information * p = new type_information[b]; //2 выделение памяти под динамический массив
    for (unsigned int i=0; i<b; i++)
    {
        cout << "\nInput structure.\nInput family: ";
        gets((p+i)->family);
        cout << "Input school class (format-number : x) : ";
        cin >> (p+i)->school_class;
        cout << "Input year of birth (format-number : xxxx) : ";
        gets((p+i)->year_of_birth);
    } 
    fwrite(p, sizeof(type_information), b, f);
    delete [] p; //освобождение памяти
    fclose(f); //закрытие файла
    return 0;
}
//----------------------------------------
 
int Create_db(FILE * f) //создание ДБ (буферизировано)
{
    system("CLS"); //очистка экрана
    unsigned int sum; //количество записей
    cout << "Enter the number of records : ";
    cin >> sum; //ввод
    if (0 == (sum%F_buf)) create_db_ch(f, sum/F_buf);
    else { 
        create_db_ch(f, (sum-(sum%F_buf))/F_buf); 
        create_db_not_ch(f, sum%F_buf); 
        }
    cout << "\nSuccessfull!";
    _getch();
    return 0;
}
//----------------------------------------
int View_db(FILE * f) //вывод на экран
{
    system("CLS"); //CLS
    type_information struct_ofschool;
    f=fopen(file_name, "r"); //отрытие на чтение
    cout << "       Surname" << " Class" << " Old\n";
    while(fread(&struct_ofschool, sizeof struct_ofschool, 1, f))
    {
        printf("%14s %1d %8s\n", struct_ofschool.family, struct_ofschool.school_class, struct_ofschool.year_of_birth);
    }
    fclose(f);
    cout << "done!";
    _getch();
    return 0;
}
//----------------------------------------
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.05.2010, 20:17     Буферизованный ввод в файл
Посмотрите здесь:

Файл. Ввод/вывод. C++
Ввод-вывод в файл на C++ C++
C++ Файл: Изменить программу таким образом чтобы ввод исходных данных осуществлялся из файла, результат также должен выводиться в файл
Ввод и вывод в файл C++
Ввод\вывод в файл C++
C++ Ввод данных в файл
Ввод и вывод в файл C++
Неверный ввод в файл C++
Ввод в файл С++ C++
Ввод данных в файл C++
C++ Файл ввод-вывод
Ввод в файл C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
promix_17
14 / 14 / 2
Регистрация: 12.05.2010
Сообщений: 43
12.05.2010, 20:33     Буферизованный ввод в файл #2
Слушай, а что ты не пользуешься стандартным вводом\выводом С++? Так намного проще...
oinari
 Аватар для oinari
5 / 5 / 0
Регистрация: 18.10.2009
Сообщений: 69
12.05.2010, 20:47  [ТС]     Буферизованный ввод в файл #3
promix_17, я заполнял структуру (без динамики), кидал в файл, опять заполнял и опять кидал и так n раз (в моём случае sum, почему sum, а не n? не знаю, писал ночью). Когда у нас 20 sum, это не так долго, а в условиях когда 1 000, у нас будет постоянно гореть лампочка активности жд. Конечно я бы и рад сделать по своему, но тогда я лабу не сдам))))) а это, увы, главное.
promix_17
14 / 14 / 2
Регистрация: 12.05.2010
Сообщений: 43
12.05.2010, 21:11     Буферизованный ввод в файл #4
Или так сразу в одной функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
int Create_db(FILE * f) //создание ДБ (буферизировано)
{
        system("CLS"); //очистка экрана
        unsigned int sum; //количество записей
        cout << "Enter the number of records : ";
        cin >> sum; //ввод
        f=fopen(file_name, "w"); //создание нового файла
        type_information * p=new type_information[F_buf]; ; 
 
for(int j=0; j<sum ; j++)
{
     cout << "\nInput structure.\nInput family: ";
     gets((p+j%5)->family);
     cout << "Input school class (format-number : x) : ";
     cin >> (p+j%5)->school_class;
     cout << "Input year of birth (format-number : xxxx) : ";
     gets((p+j%5)->year_of_birth);
 
if(!((j+1)%5)))
{
  fwrite(p, sizeof(type_information), F_buf, f);
  delete [] p;
  fclose(f); //save
  f=fopen(file_name, "w"); //new 5 records
  p = new type_information[F_buf]; //new 5 records
}
}
if(sum%5)
{
   fwrite(p, sizeof(type_information),sum%5 , f);
   delete [] p;
   fclose(f);
}
         cout << "\nSuccessfull!";
        _getch();
        return 0;
}
В общем понял?
oinari
 Аватар для oinari
5 / 5 / 0
Регистрация: 18.10.2009
Сообщений: 69
12.05.2010, 22:00  [ТС]     Буферизованный ввод в файл #5
promix_17, не разбираясь запустил, в файл попала только последняя запись.

Добавлено через 42 минуты
Цитата Сообщение от promix_17 Посмотреть сообщение
В общем понял?
ой) не увидел) в общем - да) thx
Yandex
Объявления
12.05.2010, 22:00     Буферизованный ввод в файл
Ответ Создать тему
Опции темы

Текущее время: 13:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru