Символы форматирования аргументов
Символ |
Вводимое значение |
Тип аргумента функции |
i |
Десятичное, восьмеричное или шестнадцатеричное целое |
int *arg; |
l |
Десятичное, восьмеричное или шестнадцатеричное целое |
long *arg; |
d |
Десятичное целое |
int *arg; |
D |
Десятичное целое |
long *arg; |
u |
Десятичное целое без знака |
unsigned int *arg; |
U |
Десятичное целое без знака |
unsigned long *arg; |
e, E |
Действительное с плавающей запятой |
float *arg; |
s |
Строка символов |
char arg[ ]; |
c |
Символ |
char *arg; |
l |
Расширяет тип целого до long int, а тип действительного – до double |
long int* arg; double *arg; |
1.2. Двоичные файлы
Двоичный файл представляет собой последовательность символов, в которой без каких-либо разделителей (пробелов, символов конца строки и т.д.) хранятся символы, отображающие различные объекты. Они совпадают с тем, как хранятся соответствующие объекты в оперативной памяти. Последовательность хранения данных в двоичном файле задается программой.
Двоичные файлы имеют преимущества перед текстовыми при хранении числовых данных, операции записи и чтения в таких файлах производятся намного быстрее, т.к. отсутствует необходимость форматирования – перевода в текстовое представление и обратно. Двоичные файлы, как правило, имеют гораздо меньший объем, чем текстовые. В двоичных файлах можно производить запись и чтение в произвольной последовательности.
Открытие двоичных файлов осуществляется аналогично текстовым:
FILE *F1,*F2;
F1=fopen(“Text.txt”,”rb”); // Только чтение
F2=fopen(“Text.txt”,”rb+”); // Чтение и запись.
Запись и чтение в двоичном файле производятся соответственно функциями fwrite и fread:
size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);
size_t fread(void *ptr, size_t size, size_t n, FILE *stream);
где ptr – указатель на выводимые или вводимые данные; size – размер в байтах передаваемых данных; n – число передаваемых данных; stream – поток.
Пример записи и чтения:
struct new_struct // Описание структуры
{
int a;
char ch;
};
// В обработчике кнопки «Запись»
FILE *F1;
new_struct s;
if ((F1 = fopen("test.dat", "wb")) == NULL) /* Если не удалось открыть файл */
return 1;
s.a = 20;
s.ch = 'A';
double h=6.789;
fwrite(&s, sizeof(s), 1, F1); /* Запись структуры в файл */
fwrite(&h, sizeof(double), 1, F1); /* Запись переменной в файл */
fclose(F1); /* Закрыть файл */
// В обработчике кнопки «Чтение»
FILE *F1;
new_struct s;
F1=fopen("Text.dat","rb+");
fseek(F1, SEEK_SET, 0);
fread(&s,sizeof(s),1,F1); /* Прочитать структуру из файла */
fclose(F1); /* Закрыть файл */
В данном примере при записи и чтении данных используется оператор sizeof, который определяет размер в байтах переменной либо типа данных:
sizeof(s), где s – объект структуры;
sizeof(double), определяет размер типа double.
2. Файловый ввод/вывод с помощью потоков в стиле С++
В С++ определены три класса потокового ввода/вывода:
ifstream |
входные файлы для чтения |
ofstream |
выходные файлы для записи |
fstream |
файлы для чтения и записи |
При работе с файлами этих классов можно использовать ряд присущих им функций, но можно также использовать операции помещения в поток (<<) и извлечения из потока (>>). Для работы с этими классами необходимо подключение заголовочного файла:
# include <fstream.h>,
для изменения манипуляторов потока необходимо подключить
#include <iomanip.h>
#include <rw\iosbase.h>
Таблица 4
Основные функции для работами с файлами с помощью потоков С++
Функция |
Описание |
Примеры |
put |
Вывод символа в поток |
ofstream out1 (“Test.dat”); // out – поток для записи out1. put (‘Б’); out1. put (‘T’). put (‘\n’); // Допускается сцепленный вызов |
write |
Выводит в файл из символьного массива, указанного первым параметром, число символов, указанных вторым параметром |
out1. write(s, 5); // вывести 5 символов из массива s |
get |
Получить одиночный символ из указанного потока |
ifstream in1(“Test.dat”); char c; int cnt=0; while ((c=in1. get())!=EOF) { cnt++; } |
getline |
Получить строку из потока |
char s[80]; in1. getline (s, 80); |
eof |
Проверка достижения конца файла |
if(in1.eof()) break; // Если считанный символ – символ конца файла, то прервать работу |
close |
Закрыть поток |
out1.close(); in1. close(); |
Манипуляторы системы счисления (<iomanip.h>) |
||
dec |
Десятичная |
ofstream out1 (“Test.dat”); int a=31; out1<<a<<’ ’<<hex<<a<<’ ‘<<oct<<a<<’ ‘<< setbase(10)<<a<< endl; // endl – конец строки |
oct |
Восьмеричная |
|
hex |
Шестнадцатеричная |
|
setbase |
Задать систему счисления |
|
Точность выводимых чисел (<iomanip.h>) |
||
precision |
Метод |
for (int I=0;I<10;I++) out1. precision(I); out1<<sqrt(7)<<endl; /* значение параметра I==0 – установка точности по умолчанию = 6 */ |
setprecision |
Манипулятор потока |
for (int I=0;I<10;I++) out1<<setprecision(I)<<sqrt(7)<<endl; /* значение параметра I==0 – установка точности по умолчанию = 6 */ |
Число символьных позиций, в которые число будет выведено (<iomanip.h>) |
||
width |
Метод |
int k=25; out1. width(5); out1<<k<<endl; |
setw |
Манипулятор потока |
int k=25; out1<<setw(5)<<k<<endl; |
Флаги состояния формата (rw\iosbase.h) |
||
ios::skipws |
Пропуск символов разделителей во входном потоке |
|
ios::left |
Выравнивание по левой границе поля |
|
ios::right |
Выравнивание по правой границе поля |
|
ios::internal |
Выравнивание знака или системы счисления по левой, а числа – по правой границе поля |
|
ios::dec |
Десятичная система счисления |
|
ios::oct |
Восьмеричная |
|
ios::hex |
Шестнадцатеричная |
|
ios::showbase |
Вывод основания системы счисления |
|
ios::showpoint |
Обязательная печать десятичной точки и нулевых младших разрядов |
|
ios::uppercase |
Вывод символов X и Е в верхнем регистре в hex и эксп. форматах соответственно |
|
ios::showpos |
Вывод символа «+» перед положительными числами |
|
ios::scientific |
Экспоненциальное представление действительных чисел |
|
ios::fixed |
Формат действительных чисел с фиксированной точкой |
|
Управление флагами состояния формата (rw\iosbase.h и iomanip.h) |
||
flags |
Задание сразу всех флагов |
|
setf Метод |
Установка одного и более параметров |
out1.setf(ios::left | ios::scientific); out1<<sqrt(7)<<endl; |
setiosflags Манипулятор |
out1<<setiosflags(ios::left | ios::scientific)<<sqrt(7) <<endl; |
|
unsetf Метод |
Сброс флагов, указанных параметром |
out1. unsetf(ios::left | ios::scientific); out1<<sqrt(7)<<endl; |
resetiosflags Манипулятор |
out1<<resetiosflags(ios::left)<<resetiosflags(ios::scientific)<<sqrt(7) <<endl; |
|
