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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
oinari
5 / 5 / 0
Регистрация: 18.10.2009
Сообщений: 69
#1

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

12.05.2010, 20:17. Просмотров 939. Ответов 4
Метки нет (Все метки)

Доброго времени суток.
Нужна помощь с программой, для начала что она делает и в чём "соль":
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++
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;conio.h&gt; using namespace std; void main() { std::ifstream out; ...

ВВод в файл срочно - C++
народ нужно ввести в файл итог из данного выражения for(i=0;i&lt;n;i++) cout&lt;&lt;p&lt;&lt;setw (3); cout&lt;&lt;endl&lt;&lt;&quot;min=&gt;&quot;&lt;&lt;min&lt;&lt;endl; ...

Ввод и вывод в файл - C++
Данные вводимые в 11-ой строке стираются в 13-ой? #include &quot;stdafx.h&quot; #include &lt;fstream&gt; #include &lt;iostream&gt; using namespace std; ...

Ввод/вывод в файл - C++
Как переменные всех объектов вывести в файл? Создаю массив из 2 объектов, но записываются значения только последнего введенного. Значения...

ввод и вывод в файл - C++
помогите исправить код, мне нужно чтобы с файла считывало три слова и выводило туда общую букву,напримервывести должно букву а только...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
promix_17
14 / 14 / 2
Регистрация: 12.05.2010
Сообщений: 43
12.05.2010, 20:33     Буферизованный ввод в файл #2
Слушай, а что ты не пользуешься стандартным вводом\выводом С++? Так намного проще...
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;
}
В общем понял?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.05.2010, 22:00     Буферизованный ввод в файл
Еще ссылки по теме:

Ввод\вывод в файл - C++
Здравствуйте! Подскажите пожалуйста, как ПРАВИЛЬНО организовать ввод и вывод в файл в С++.И ещё,подскажите как в файле при чтении или...

Ввод вывод в файл - C++
у меня задание Написать программу на языке C++, осуществляющую чтение из файла содержащего 10 целых чисел, кратных вашему номеру в журнале...

Ввод данных в файл - C++
Всем привет. Возникла вот такая проблема. вот часть программы точней функция из программы, ну тут все понятно. char frazza; ...

Ввод данных в файл - C++
Здравствуйте! Есть программа: #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;iomanip&gt; #include &lt;windows.h&gt; #include...


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

Или воспользуйтесь поиском по форуму:
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     Буферизованный ввод в файл
Ответ Создать тему
Опции темы

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