Хелпикс

Главная

Контакты

Случайная статья





Функции работы с буферами.. Определение класса символов.



Функции работы с буферами.

Функция Синтаксис Действия Возвращаемое значение
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 При использовании или копировании материалов прямая ссылка на сайт обязательна.