|
||||
Функции работы с буферами.. Определение класса символов. ⇐ ПредыдущаяСтр 2 из 2 Функции работы с буферами. | ||||
№ | Функция | Синтаксис | Действия | Возвращаемое значение |
19. | memchr | char *memchr (buf1, sim, n) | Ищет символ sim среди первых n символов buf1. | Указатель на sim, если нашла. NULL, если нет. |
20. | memcmp | int memcmp (buf1, buf2, n) | Лексикографически сравнивает первые n символов buf1 и buf2 | <0, если buf1<buf2 =0, если buf1=buf2 >0, если buf1>buf2. |
21. | memicmp | int memicmp (buf1, buf2, n) | Cравнивает первые n символов строк buf1 и buf2. Маленькие и большие буквы считаются одинаковыми. | См. memcmp |
22. | memcpy | char *memcpy(buf1,buf2,n, sim) | Копирует из buf2 в buf1 до тех пор, пока не встретится символ sim или не скопируем n байтов. | Указатель на buf1 |
23. | memccpy | char *memcpy(buf1,buf2,n ) | Копирует n символов из buf2 в buf1. | Указатель на buf1 |
24. | memset | char *memset (buf1, sim, n) | Заполняем первые n байт буфера buf1 символом sim. | Указатель на buf1 |
Помимо данных функций, во многих задачах можно использовать макросы, которые осуществляют проверку символа:
Определение класса символов. | ||
№ | Функция | Проверка на… |
25. | isalpha | Букву |
26. | isalnum | букву или цифру |
27. | isascii | символ ASCII |
28. | iscntrl | управляющий символ |
29. | isdigit | десятичную цифру |
30. | isxdigit | 16-ричную цифру. |
31. | isgraph | печатаемый символ (не пробел). |
32. | isprint | печатаемый символ (в том числе и пробел). |
33. | islower | прописную букву. |
34. | isupper | заглавную букву. |
35. | isspace | пробельный символ. |
36. | ispunct | знак пунктуации. |
Приведем пример использования данных функций.
Дано предложение. Напечатать все его слова, состоящие из трех слогов.
char str [100];
char *str1 =”аоуэыАОУЭЫ”;
int chisloSlogov(int nach, int con);
void pechatSlovo(int nach, int con);
main(){
int nachalo =0, dlina;
clrscr();
gets(str);
strcat(str,” “);
while(str [nachalo] !=’\0’ ){
dlina = strcspn(str+nachalo, “ ”);
if(chisloSlogov(nachalo, nachalo+dlina) == 3)
pechatSlovo(nachalo, nachalo+dlina);
nachalo=nachalo+dlina+1;
}
getch();
return(0);
}
int chisloSlogov(int nach, int con){
int sch=0;
for(int i=nach; i<=con;i++)
if(strchr(str1,str[i])!=NULL)
sch++;
return(sch);
}
void pechatSlovo(int nach, int con){
for(int i=nach; i<=con;i++)
printf(“%c”,str[i]);
}
Ввод – вывод.
Различают ввод – вывод верхнего уровня (с испоьзованием понятия “поток”) и ввод – вывод нижнего уровня (с использованием понятия “дескриптор”).
Ввод – вывод верхнего уровня обеспечивает буферизацию (когда происходит чтение или запись в файл, обмен информацией осуществляется не между программой и файлом, а между программой и буфером, расположенным в оперативной памяти).
Запись.
Пишем в буфер, пока он не заполнится. Информация переписывается из буфера в файл или при заполнении всего буфера, или при закрытии файла.
Чтение.
Читаем из буфера. В буфер информация пишется при открытии файла и при заполнении буфера.
На верхнем уровне возможны форматный ввод – вывод (функции fprintf и fscanf).
Файл, открытый на верхнем уровне – последовательность считываемых или записываемых байтов (поток, stream). Когда поток открывается для ввода – вывода, с ним связывается указатель на структуру типа FILE, которая содержит разнообразную информацию о файле.
Далее функции работы с файлом используют не имя файла, а этот указатель.
В любой момент открыты 5 стандартных потоков:
stdin | Стандартный ввод |
stdout | Стандартный вывод |
stderr | Стандартный вывод ошибок |
stdoux | Стандартный порт |
stdprn | Стандартное устройство печати |
Открытие файла для потокового ввода-вывода осуществляется с помощью функции fopen.
Синтаксис данной функции следующий:
FILE * fopen(char *name, char *type);
Функция открывает файл с именем name и возвращает указатель на структуру типа FILE, которая связана с нашим файлом. Все остальные функции ввода-вывода будут обращаться к файлу при помощи этого указателя.
Аргумент type показывает, для чего мы открываем файл. Он может принимать следующие значения:
“r” | Открыть для чтения (файл должен существовать). |
“w” | Открыть для записи (Открывается пустой файл. Если файл с таким именем существовал, его содержимое теряется) |
“a” | Открыть для добавления (Если файл не существует, он создается) |
“r+” | Чтение + Запись (Файл должен существовать) |
“w+” | Пустой файл для чтения и записи. |
“a+” | Чтение и добавление. |
Можно еще добавить t – текстовый файл или b – двоичный (объяснить разницу).
Лучше открывать файл с проверкой.
FILE *f;
if ( (f=fopen(“mfile.c”,”rb+”))==NULL){
printf(“Не могу открыть файл”);
getch();
exit(1);
}
fclose (f) – закроет этот файл.
Место в файле, начиная с которого мы читаем или пишем, называется file pointer. Можно в разумных пределах перемещать file pointer по файлу.
Функция ftel(f) возвращает значение file pointer () в байтах.
Функция rewind(f) перемещает file pointer в начало файла.
Функция fseek(f,смещение, нач. значение) перемещает file pointer в нужное место файла.
Здесь смещение – это количество байтов, на которое мы хотим переместить file pointer (Может быть и отрицательным).
Нач. значение показывает, откуда мы отсчитываем смещение:
От начала файла | |
От текущего file pointer | |
От конца файла |
Функция feof(f) проверяет, достигли ли мы конца файла.
Функции ввода – вывода высокого уровня:
Чтение | Запись | ||
символа | |||
fgetc | Из потока | fputc | В поток |
fgetchar | Из stdin | fputchar | В stdout |
getc | Из потока(макрос) | putc | В поток (макрос) |
getchar | Из stdin (макрос) | putchar | В stdout (макрос) |
getch | С консоли без эха | putch | На консоль |
getche | С консоли с эхом | ||
| |||
строки | |||
fgets | Из потока | fputs | В поток |
gets | Из stdin | puts | В stdout |
cgets | С консоли | cputs | На консоль |
| |||
Неформатированное чтение / запись | |||
fread | fwrite | ||
| |||
Форматированное чтение / запись | |||
cscanf | С консоли | cprintf | На консоль |
fscanf | Из потока | fprintf | В поток |
scanf | Из stdin | printf | В stdout |
sscanf | Из строки | sprintf | В строку |
Привести примеры использования.
|
© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.
|
|