
- •Билет 1. Логические операции. Логические выражения.
- •Билет 2. Поразрядные логические операции.
- •Билет 3.Условный оператор.
- •If (условие)
- •Билет 5 . Оператор цикла с постусловие do-while. Прерывание работы цикла.
- •Билет 6. Оператор цикла for. Прерывание работы цикла.
- •Билет 7. Оператор выбора switch.
- •Билет 8. Массивы; их описание. Размещение в памяти, инициализации.
- •Билет 9. Строки их описание, инициализация.
- •Билет 17. Функции текстового преобразования sscanf и sprintf
- •Билет 18. Аргументы функции main.
Билет 17. Функции текстового преобразования sscanf и sprintf
Стандартная библиотека ввода-вывода Си предоставляет также две замечательные функции sscanf и sprintf ввода и вывода не в файл или поток, а в строку символов (т.е. массив байтов), расположенную в памяти компьютера. Мнемоника названий функций следующая: в названии функции fscanf первая буква f означает файл (file), т.е. ввод производится из файла; соответственно, в названии функции sscanf первая буква s означает строку (string), т.е. ввод производится из текстовой строки. (Последняя буква f в названиях этих функций означает форматный). Первым аргументом функций sscanf и sprintf является строка (т.е. массив символов, ограниченный нулевым байтом), из которой производится ввод или в которую производится вывод. Эта строка как бы стоит на месте файла в функциях fscanf и fprintf.
Функции sscanf и sprintf удобны для преобразования данных из текстового представления во внутреннее и обратно. Например, в результате выполнения фрагмента
char txt[256] = "-135.76"; double x;
sscanf(txt, "%lf", &x);
текстовая запись вещественного числа, содержащаяся в строке txt, преобразуется во внутреннее представление вещественного числа, результат записывается в переменную x. Обратно, при выполнения фрагмента
char txt[256]; int x = 12345;
sprintf(txt, "%d", x);
значение целочисленной переменной x будет преобразовано в текстовую форму и записано в строку txt, в результате строка будет содержать текст " 12345 ", ограниченный нулевым байтом.
Для преобразования данных из текстового представления во внутреннее в стандартной библиотеке Си имеются также функции atoi иatof с прототипами
int atoi(const char *txt); // текст => int
double atof(const char *txt); // текст => double
Функция atoi преобразует текстовое представление целого числа типа int во внутреннее. Соответственно, функция atofпреобразует текстовое представление вещественного числа типа double. Мнемоника имен следующая:
atoi означает "character to integer";
atof означает "character to float".
(В последнем случае float следует понимать как плавающее, т.е. вещественное, число, имеющее тип double, а вовсе не float! Типfloat является атавизмом и практически не используется.)
Прототипы функций atoi и atof описаны в стандартном заголовочном файле " stdlib.h ", а не "stdio.h", поэтому при их использовании надо подключать этот файл:
#include <stdlib.h>
(вообще-то, это можно делать всегда, поскольку "stdlib.h" содержит описания многих полезных функций, например, функции завершения программы exit, генератора случайных чисел rand и др.).
Отметим, что аналогов функции sprintf для обратного преобразования из внутреннего в текстовое представление в стандартной библиотеке Си нет. Компилятор Си фирмы Borland предоставляет функции itoa и ftoa, однако, эти функции не входят в стандарт и другими компиляторами не поддерживаются, поэтому пользоваться ими не следует.
Билет 18. Аргументы функции main.
main(int ARGC,char **ARGV)
{
while (ARGC--)
printf("\n %s ",ARGV[ARGC]);
}
Допустим, программа называется
obrab_1.exe
Тогда, если ее вызвать из подкаталога TC на диске C следующим образом:
C:\TC>obrab_1 one two
то программа выдаст на экран такую информацию:
two
one
C:\TC\obrab_1.exe
В языке C заданы два встроенных аргумента функции main: argc и argv.
Выглядит это так:
int main(int argc, char *argv[]) {...}
Аргумент argc типа integer содержит в себе количество аргументов командной строки.
Аргумент argv типа char - указатель на массив строк. Каждый элемент массива указывает на аргументы командной строки. Один параметр отделяется от другого пробелами.
argv[0] - полное имя запущенной программы
argv[1] - первая строка записаная после имени программы
argv[2] - вторая строка записаная после имени программы
argv[argc-1] - последняя строка записаная после имени программы
argv[argc] – NULL
Билет 19. Файлы, их описание, открытие\закрытие текстового файла.
Пример открытия файла
File *in;
if((in=fopen("myfile.dat","r"))==NULL)
{ printf("\n Файл myfile.dat не открыт."); exit(1);}
Закрытие файла осуществляет функция
fclose(указатель_файла);
Работа со стандартным файлом:
scanf ( управляющая строка, данные );
printf (управляющая строка,данные);
gets ( имя_строки );
puts( строка или имя строки );
getchar();
getch();
getche();
putchar( символ или имя_символа )
Работа с произвольным файлом:
fscanf(указатель_файла,управляющая_строка, данные);
fprintf(указатель файла,управляющая строка, данные);
fgets ( имя_строки,колич.симв.,указ._файла );
fputs ( строка или имя_строки,указ._файла );
getc ( указатель_файла) ;
putc( символ или имя_символа,указ._файла);
Билет 20. Файл, их описание, открытие\закрытие двоичного файла.
В отличие от текстовых файлов доступ к элементам бинарных файлов выполняется в произвольном порядке, а не последовательно. Поэтому бинарные файлы называют файлами произвольного доступа. Приложение, в котором предполагается использовать файлы произвольного доступа, должно их создавать. Все записи в таком файле должны быть одинаковой фиксированной длины. Данные могут быть вставлены в файл прямого доступа без разрушения других данных, изменены или удалены без перезаписи всего файла. Для получения доступа к бинарному файлу(потоку) в MVS нужно: Создать поток соответствующего типа: ifstream- для ввода из файла ; ofstream- для вывода в файл; fstream - для обмена с файлом в двух направлениях. Связать его с файлом данных и открыть (open) для работы в определенном режиме, с обязательным указанием двоичного режима ios::binary(по умолчанию потоки открываются в текстовом режиме):
Для закрытия потока используется функция close().
Двоичные файлы. Бесформатный ввод-вывод:
fread(куда, размер, сколько, указатель_файла);
– для чтения из файла,
fwrite (откуда, размер, сколько,указатель_файла);
– для записи в файл.
При этом, в fopen
режим дополняется опцией ”b”
(двоичный файл), например,
"wb+"
(по умолчанию действует ”t”
— текстовый файл).
Двоичные файлы. Бесформатный ввод-вывод:
ПРИМЕР:
#include<stdio.h>
main( )
{
FILE *in;
int i,a[10]={1,2,3,4,5,6,7,8,9,10},b[10];
in=fopen("D:\\ISTAS\\myfile.dat","wb+");
fwrite(a,2,10,in);
rewind(in);
fread (b,2,10,in); puts ("\nМассивB\n");
for (i=0;i<10;i++)
printf (" %d",b[i]);
}
Указание позиции при работе с файлом:
ftell (указатель файла);
fseek( указатель_файла, величина_сдвига, точка_отсчета);
SEEK_SET – начало файла,
SEEK_CUR – текущая позиция,
SEEK_END – конец файла.
Б) Чтение из двоичного файла
FILE *out;
...
in=fopen("VkladBin.dat","rb");
fread(&NC,sizeof(int),1,in);
clients=(struct z*)malloc(NC*sizeof(struct z));
fread(clients,sizeof(struct z),NC,in);
fclose(in);
Билет 21. Чтение из файла, запись в файл. С использованием форматов.
Объявление файла производится следующим образом:
FILE указатель файла1[,..,указатель файлаN];
Например
FILE *in, *out, *f1;
Открытие файла:
указатель_файла=fopen(имя_файла, режим_работы);
Возможны следующие режимы работы:
r – открытие файла на чтение (при этом открываемый файл должен существовать);
w – открытие файла на запись (если открываемого файла нет, то он будет создан; если этот файл уже есть, то его содержимое стирается);
a – открытие файла на дозапись (при этом, если файла нет, то он создается);
r+ – открытие файла на чтение и запись (при этом открываемый файл должен существовать);
w+ – открытие файла на чтение и запись (при этом содержимое открываемого файла стирается);
a+ – открытие файла на чтение и дозапись (при этом, если файла нет, то он создается).
Работа со стандартным файлом:
scanf ( управляющая строка, данные );
printf (управляющая строка,данные);
gets ( имя_строки );
puts( строка или имя строки );
getchar();
getch();
getche();
putchar( символ или имя_символа )
Билет 22. Чтение из файла, запись в файл. Без форматов.
Работа с произвольным файлом:
fscanf(указатель_файла,управляющая_строка, данные);
fprintf(указатель файла,управляющая строка, данные);
fgets ( имя_строки,колич.симв.,указ._файла );
fputs ( строка или имя_строки,указ._файла );
getc ( указатель_файла) ;
putc( символ или имя_символа,указ._файла);
Двоичные файлы. Бесформатный ввод-вывод:
fread(куда, размер, сколько, указатель_файла); – для чтения из файла,
fwrite (откуда, размер, сколько,указатель_файла); – для записи в файл.
При этом, в fopen режим дополняется опцией ”b”(двоичный файл), например,
"wb+" (по умолчанию действует ”t” — текстовый файл).
Двоичные файлы. Бесформатный ввод-вывод:
ПРИМЕР:
#include<stdio.h>
main( )
{
FILE *in;
int i,a[10]={1,2,3,4,5,6,7,8,9,10},b[10];
in=fopen("D:\\ISTAS\\myfile.dat","wb+");
fwrite(a,2,10,in);
rewind(in);
fread (b,2,10,in); puts ("\nМассивB\n");
for (i=0;i<10;i++)
printf (" %d",b[i]);
}
А) Чтение данных из текстового файла и запись в двоичный файл.
FILE *in,*out;
...
in=fopen("Vklad.dat","r");
out=fopen("VkladBin.dat","wb");
fscanf(in,"%d",&NC);
clients=(struct z*)malloc(NC*sizeof(struct z));
for(i=0;i<NC;i++)
fscanf(in,"%s%s%ld%s",clients[i].name,
clients[i].vid, &clients[i].summa,
clients[i].data);
fwrite(&NC,sizeof(int),1,out);
for(i=0;i<NC;i++)
fwrite(clients,sizeof(struct z),NC,out);
/*
или одной командой
fwrite(clients,sizeof(struct z),NC,out);
*/
fclose(in); fclose(out);
Указание позиции при работе с файлом:
ftell (указатель файла);
fseek( указатель_файла, величина_сдвига, точка_отсчета);
SEEK_SET – начало файла,
SEEK_CUR – текущая позиция,
SEEK_END – конец файла.
Б) Чтение из двоичного файла
FILE *out;
...
in=fopen("VkladBin.dat","rb");
fread(&NC,sizeof(int),1,in);
clients=(struct z*)malloc(NC*sizeof(struct z));
fread(clients,sizeof(struct z),NC,in);
fclose(in);
Билет 23. Определение текущий позиции в файле, ее установка.
Указание позиции при работе с файлом:
ftell (указатель файла);
fseek( указатель_файла, величина_сдвига, точка_отсчета);
SEEK_SET – начало файла,
SEEK_CUR – текущая позиция,
SEEK_END – конец файла.
Билет 24. Чтение из файла после записи и запись после чтения.