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

Форматирование поток ввода\вывода - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
Stormfire
0 / 0 / 0
Регистрация: 29.11.2010
Сообщений: 43
16.10.2011, 22:23     Форматирование поток ввода\вывода #1
Здравствуйте, прощу объяснить и помочь дописать небольшой кусочек программы.

3адание:
Определить структуру, елементами которой есть данные про студента (фамилия, стедний бал, стипендия). Ввести данные с клавиатуры, записать в текстовый и бинарный файл.Во время запись в текстовый файл отформатировать данные с помощью параметризованных манипуляторов (точность, ширина поля, заполнители), простих манипуляторов (систем исчисления, игнорирование пробелов), флажков форматирования(выравнивание данных, переведение в верхний реестр и т.д.).

Проблема:
Определил, записал в текстовый и бинарный файлы, но вот с форматированием не очень понимаю.
С шириной еще разобрался
Не пугайтесь размерам СППшника. Интересует только функция Doit,а точнее строкии 89-92. Насколько я понял, форматирование нужно указывать именно там. Если с width еще кое-как разобрался, то как точность, заполнители и так далее сделать?
p.s. комментарии на Украинском, не пугайтесь.

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
#include <stdlib.h>
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <string.h>
#include <conio.h>
#include <iomanip>
using namespace std;
 
struct stud
{
char name[20]; //ім'я студента
char scholarship[20]; //стипендія
char mark[20];//середній бал
};
 
struct student                 
{
    stud studentt[15];
    int stnum; //кількість студентів
};
 
stud student;
 
ifstream f1; //файловий потік введення
ofstream f2; //файловий потік виведення
 
void input() //введення даних
{ 
f2.open("binar.dat", ios::out|ios::binary); //відкрити вхідний потік
 
    if(!f2) //якщо файл не існує 
    {
    cout<<"Error in source file "<<endl; //вивести повідомлення
    }  
    else
    {           
    char answer_stud; //параметр закінчення введення даних про студента
               
        int j=0; //початкове значення лічильника кількості студентів
            
            do  
            {
            //введення даних про студента
            cout<<"\nStudent\'s name: "; 
            cin>>student.name;
            f2<<student.name<<endl;
            fflush(stdin);
 
            cout<<"Student\'s scholarship: ";
            cin>>student.scholarship;
            f2<<student.scholarship<<endl;
            fflush(stdin);
 
            cout<<"Student\'s mark: ";
            cin>>student.mark;
            f2<<student.mark<<endl;
            fflush(stdin);
 
            j++; //перехід до наступного студента
 
            cout<<"\nDo you want to add another student? y/n"<<endl;
            answer_stud = getch();
            }
            while(answer_stud != 'n'); //кінець введення даних про студента 
                    }
    f2.close(); //закриття файлу
    }
int doit(const char *source, const char *dest) //копіювання
{ 
char c; //символ, що зчитується з файлу
 
f1.open(source,ios::in); //відкрити вхідний потік
 
if(!f1) //якщо файл не існує 
{
cerr<<"Error in source file "<<source<<endl; return -1;} //вивести повідомлення
 
f2.open(dest,ios::out); //відкрити вихідний потік
 
if(!f2) //якщо потік відкрити неможливо
{
cerr<<"File already exist "<<dest<<endl; return -1;}
 
while(f1) //поки не кінець вхідного потоку
{
f1.get(c); //зчитувати з потоку по одному символу
f2.width(2);//мінімальна ширина поля виведення
 
f2<<c; //записати символ у вихідний потік
} 
 
cout<<endl<<"File created and its size is"; //вивести повідомлення
long size=f2.tellp();     
cout<<" "<<size<<" bytes\n";//вивести розмір створенного файлу
cout<<"Goodbit checking(No errors in bits if 1): "<<cin.good()<<endl<<endl;//перевірка на помилки в бітах
getch();
f1.close(); //закрити файли
f2.close();
cin.clear();//очищення потоку
return 1;
}
int main()
 
{
    char s[50] = "binar.dat", d[50];
    int result=-1;  
 
    // цикл меню
    while(true)
    {
        system("cls");
        cout<<"1. Input binar file"<<endl;
        cout<<"2. Create text file with formating"<<endl;
        cout<<"0. Exit"<<endl;
        cout<< "Chosen menu item: ";
        int key; //номер пункту меню
        cin>>key; //вибір потрібного пункту меню
 
        // вибір пунктів меню
        switch(key)
        {
           case 1: {input();break;}  // запис у файл
           case 2: {while(result!=1)
                 {
                 cout<<"\n"<<"Enter name for txt file: ";
                 cin>>d; //ввести ім’я вихідного файлу
                 result = doit(s, d); //скопіювати файл
                 }break;}
           case 0: {exit(0);break;}  // вихід
           default: {cout<<"Choose another"<<endl;;break;}
        }
    }
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
16.10.2011, 22:33     Форматирование поток ввода\вывода #2
в iomanip есть std::setprecision() для указания точности. если использовать его вместе с std::fixed то вы можете формативаровать вывод.

например :
C++
1
2
3
double d = 1234.1234545;
 
cout << fixed << setprecision(2) << d;
в результате напечает 1234.12
Stormfire
0 / 0 / 0
Регистрация: 29.11.2010
Сообщений: 43
16.10.2011, 22:39  [ТС]     Форматирование поток ввода\вывода #3
Как с функцией cout это сделать я понимаю, а вот как это использовать с текстовым файлом - нет.
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
16.10.2011, 22:53     Форматирование поток ввода\вывода #4
Я возможно чего-то не понимаю,.... но вы разве не можете перед отправкой в файл округлить данные до необходимой вам точности ? Или о какой вы о какой-то другой точности?
Stormfire
0 / 0 / 0
Регистрация: 29.11.2010
Сообщений: 43
17.10.2011, 00:12  [ТС]     Форматирование поток ввода\вывода #5
Дело в том, что я тоже не понимаю.
Насколько я понял, нужно данные именно в момент перед записью, и да точность там не где округлять, так как double вообще нету.
Но тогда, какими еще манипуляторами кроме width можно пользоваться?

Добавлено через 55 минут
ап
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
17.10.2011, 00:24     Форматирование поток ввода\вывода #6
можете показать часть файла из которого читаете и то как вы хотите видеть данные в файле куда отгружаете?
Stormfire
0 / 0 / 0
Регистрация: 29.11.2010
Сообщений: 43
17.10.2011, 01:57  [ТС]     Форматирование поток ввода\вывода #7
Данные в файл вводяться через функцию инпут.
Создается струтура(имя, степендия, оценка) путём ввода с консоли и потоково заносится в файл бинарный, потом копируеться из бинарного в текстовый и должно происходить форматирование...
Хочу видеть - согласно условиям задачи о форматировании.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.10.2011, 02:09     Форматирование поток ввода\вывода
Еще ссылки по теме:

Перегрузка вывода в поток C++
как можно сделать виртуальный поток ввода\вывода C++
C++ Как сделать отступы или , чтобы входной поток(ввода) отдельно от вывода

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

Или воспользуйтесь поиском по форуму:
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
17.10.2011, 02:09     Форматирование поток ввода\вывода #8
ТУТ сказано что fstream наследует от ios_base то что вам надо. (i.e. precision, flags, width, ... etc.)
Yandex
Объявления
17.10.2011, 02:09     Форматирование поток ввода\вывода
Ответ Создать тему
Опции темы

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