Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

12.05.2010, 20:17. Просмотров 963. Ответов 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;
}
//----------------------------------------
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.05.2010, 20:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Буферизованный ввод в файл (C++):

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

Ввод в файл - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;conio.h&gt; using namespace std; void main() { std::ifstream out; ...

Ввод в файл С++ - C++
Здравствуйте данная программа создает тест который нужно пройти при введении вопросов и ответов происходит проблема если я пишу к примеру...

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

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

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

4
promix_17
14 / 14 / 2
Регистрация: 12.05.2010
Сообщений: 43
12.05.2010, 20:33 #2
Слушай, а что ты не пользуешься стандартным вводом\выводом С++? Так намного проще...
0
oinari
5 / 5 / 0
Регистрация: 18.10.2009
Сообщений: 69
12.05.2010, 20:47  [ТС] #3
promix_17, я заполнял структуру (без динамики), кидал в файл, опять заполнял и опять кидал и так n раз (в моём случае sum, почему sum, а не n? не знаю, писал ночью). Когда у нас 20 sum, это не так долго, а в условиях когда 1 000, у нас будет постоянно гореть лампочка активности жд. Конечно я бы и рад сделать по своему, но тогда я лабу не сдам))))) а это, увы, главное.
0
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;
}
В общем понял?
1
oinari
5 / 5 / 0
Регистрация: 18.10.2009
Сообщений: 69
12.05.2010, 22:00  [ТС] #5
promix_17, не разбираясь запустил, в файл попала только последняя запись.

Добавлено через 42 минуты
Цитата Сообщение от promix_17 Посмотреть сообщение
В общем понял?
ой) не увидел) в общем - да) thx
0
12.05.2010, 22:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.05.2010, 22:00
Привет! Вот еще темы с ответами:

Ввод и вывод в файл - C++
В текстовом файле INPUT.TXT записаны целые числа через пробел, возможно, в несколько строк. За один просмотр файла сформировать список этих...

Ввод данных в файл - C++
имеется кусок рабочей(!) программы f = fopen(&quot;C:\\Users\\Кирилл\\Documents\\Visual Studio 2010\\Projects\\grimmeu\\Debug\\cik.txt&quot;,...

Файл ввод-вывод - C++
У меня есть задача в которой нужно: 1) Скопировать в файл F2 только те строки из F1, которые начинаются с символа заданного...

Ввод и вывод в файл - C++
Дан текстовый файл INPUT.TXT. Проверить в тексте файла правильности расстановки открывающих и закрывающих скобок ‘(‘, ‘)’, ‘{‘, ‘}’, ‘’....


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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