Меню сайта
Статистика
Онлайн всего: 1 Гостей: 1 Пользователей: 0 |
Лекция 15СодеÑжание
СÑандаÑÑнÑе библиоÑеÑнÑе ÑÑнкÑииÐиблиоÑека ÑзÑка Си ÑодеÑÐ¶Ð¸Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑво ÑÑнкÑий и макÑоопÑеделений. ÐиблиоÑеки менÑÑÑÑÑ Ð¾Ñ ÑиÑÑÐµÐ¼Ñ Ðº ÑиÑÑеме, но еÑÑÑ ÑдÑо ÑÑнкÑий (ÑÑандаÑÑÐ½Ð°Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñека). ÐÑи ÑÑнкÑии иÑполÑзÑÑÑÑÑ Ð´Ð»Ñ:
ÐлавнÑми пÑеимÑÑеÑÑвами ÑÑандаÑÑнÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑеÑнÑÑ ÑÑнкÑий Си ÑвлÑÑÑÑÑ Ð¼Ð¾Ð±Ð¸Ð»ÑноÑÑÑ Ð¸ низкие заÑÑаÑÑ Ð½Ð° ÑопÑовождение полÑзоваÑелÑÑÐºÐ¸Ñ Ð¿Ñиложений. ÐиблиоÑеÑнÑе ÑÑнкÑии не подвеÑÐ¶ÐµÐ½Ñ ÑаÑÑÑм изменениÑм, поÑÑÐ¾Ð¼Ñ Ð¿ÑогÑаммÑ, в коÑоÑÑÑ Ð¾Ð½Ð¸ иÑполÑзÑÑÑÑÑ, легки в ÑопÑовождении. ÐекоÑоÑÑе из ÑÑÐ¸Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑеÑнÑÑ ÑÑнкÑий ÑооÑвеÑÑÑвÑÑÑ ÑÑандаÑÑÑ ANSI С - ÑÑандаÑÑÑ Ð¡Ð¸ ÐмеÑиканÑкого наÑионалÑного инÑÑиÑÑÑа, благодаÑÑ ÑÐµÐ¼Ñ Ð¾Ð½Ð¸ пÑÐ¸ÐµÐ¼Ð»ÐµÐ¼Ñ Ð´Ð»Ñ Ð²ÑÐµÑ ÑиÑÑем, ÑооÑвеÑÑÑвÑÑÑÐ¸Ñ ÑÑÐ¾Ð¼Ñ ÑÑандаÑÑÑ. ЧÑÐ¾Ð±Ñ ÑокÑаÑиÑÑ Ð·Ð°ÑÑаÑÑ Ð¸ вÑÐµÐ¼Ñ Ð½Ð° ÑазÑабоÑÐºÑ Ð¿Ñиложений, ÑекомендÑеÑÑÑ Ð¸ÑполÑзоваÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑеÑнÑе ÑÑнкÑии Си вÑÑкий Ñаз, когда ÑÑо оказÑваеÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñм. СÑандаÑÑнÑе библиоÑеÑнÑе ÑÑнкÑии Си обÑÑвлÑÑÑÑÑ Ð² набоÑе Ñайлов-заголовков, коÑоÑÑе в UNIX-ÑиÑÑÐµÐ¼Ð°Ñ Ð¾Ð±ÑÑно ÑаÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ñ Ð² каÑалоге /usr/include. ÐпиÑем библиоÑеÑнÑе ÑÑнкÑии ANSI C, опÑеделеннÑе в ÑÐ°Ð¹Ð»Ð°Ñ -заголовков, пеÑеÑиÑленнÑÑ Ð½Ð¸Ð¶Ðµ: <stdio.h> <stdlib.h> <string.h> <memory.h> <malloc.h> <time.h> <assert.h> <stdarg.h> <getopt.h> <setjmp.h> ÐÑоме ÑказаннÑÑ , в болÑÑинÑÑве UNIX-ÑиÑÑем еÑÑÑ ÑÐ°Ð¹Ð»Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¾Ð², коÑоÑÑе не опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð² ANSI C: <pwd.h> <grp.h> <crypt.h>. Ð ÑÑÐ¸Ñ ÑÐ°Ð¹Ð»Ð°Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¾Ð² обÑÑвлÑÑÑÑÑ ÑÑнкÑии, коÑоÑÑе помогаÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð´Ð¾ÑÑÑп к инÑоÑмаÑии о бÑджеÑÐ°Ñ Ð¿Ð¾Ð»ÑзоваÑелей и гÑÑпп в UNIX-ÑиÑÑÐµÐ¼Ð°Ñ . Ð ÑказаннÑÑ ÑиÑÑÐµÐ¼Ð°Ñ Ð¾Ð½Ð¸ опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð² библиоÑеке libc.a. ÐÑи ÑÑнкÑии Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ Ð´Ð»Ñ ÑазÑабоÑки пÑиложений. Ð Ñайле заголовков <stdio.h> обÑÑвлÑеÑÑÑ Ñип даннÑÑ FILE, коÑоÑÑй иÑполÑзÑеÑÑÑ Ð² Си-пÑогÑÐ°Ð¼Ð¼Ð°Ñ Ð´Ð»Ñ Ð¾Ð±Ð¾Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾ÑоковÑÑ Ñайлов, или пÑоÑÑо поÑоков, Ñ.е. Ñайлов, обмен Ñ ÐºÐ¾ÑоÑÑми оÑÑÑеÑÑвлÑеÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑÑнкÑий поÑокового ввода-вÑвода. ÐмееÑÑÑ Ñакже Ð½Ð°Ð±Ð¾Ñ Ð¼Ð°ÐºÑокоманд и ÑÑнкÑий, пÑедназнаÑеннÑÑ Ð´Ð»Ñ Ð¼Ð°Ð½Ð¸Ð¿ÑлиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ÑоковÑми Ñайлами. Ðиже пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ð½ÐµÐºÐ¾ÑоÑÑе из ÑÑÐ¸Ñ Ð¼Ð°ÐºÑокоманд и ÑÑнкÑий, коÑоÑÑе Ñже Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð·Ð½Ð°ÐºÐ¾Ð¼Ñ Ð¸Ð· пÑедÑдÑÑÐ¸Ñ Ð»ÐµÐºÑий.
Рзаголовке <stdlib.h> обÑÑвлÑеÑÑÑ Ð½Ð°Ð±Ð¾Ñ ÑÑнкÑий, ÑлÑжаÑÐ¸Ñ Ð´Ð»Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ , генеÑаÑии ÑлÑÑайнÑÑ ÑиÑел, полÑÑÐµÐ½Ð¸Ñ Ð¸ ÑÑÑановки пеÑеменнÑÑ ÑÑÐµÐ´Ñ shell, ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ñполнением пÑогÑамм и вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ shell. ÐбÑÑно ÑÑи ÑÑнкÑии обÑÑвлÑÑÑÑÑ Ð² заголовке <stdio.h>, но Ñак как они не вклÑÑаÑÑ Ð² ÑÐµÐ±Ñ Ð¼Ð°Ð½Ð¸Ð¿ÑлиÑование поÑоками, ÑÑандаÑÑ ANSI C гÑÑппиÑÑÐµÑ Ð¸Ñ Ð² оÑделÑнÑй заголовок. Рзаголовке <string.h> обÑÑвлÑеÑÑÑ Ð½Ð°Ð±Ð¾Ñ ÑÑнкÑий, пÑедназнаÑеннÑÑ Ð´Ð»Ñ Ð¼Ð°Ð½Ð¸Ð¿ÑлиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑимволÑнÑми ÑÑÑоками. Рзаголовке <memory.h> обÑÑвлÑеÑÑÑ Ð½Ð°Ð±Ð¾Ñ ÑÑнкÑий, пÑедназнаÑеннÑÑ Ð´Ð»Ñ Ð¼Ð°Ð½Ð¸Ð¿ÑлиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð±Ð°Ð¹ÑовÑм поÑоком. ÐÑи ÑÑнкÑии Ð¿Ð¾Ñ Ð¾Ð¶Ð¸ на ÑÑÑоковÑе, но в оÑлиÑие Ð¾Ñ Ð½Ð¸Ñ Ð¸Ð¼ÐµÑÑ Ð±Ð¾Ð»ÐµÐµ ÑиÑокое назнаÑение и могÑÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ Ð¼Ð°Ð½Ð¸Ð¿ÑлиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð½ÐµÑимволÑнÑми ÑÑÑоковÑми обÑекÑами. Ð ÑаÑÑноÑÑи, даннÑе ÑÑнкÑии можно пÑименÑÑÑ Ð´Ð»Ñ Ð¸Ð½Ð¸ÑиализаÑии, ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð¸ копиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±ÑекÑов Ñипа struct. Рзаголовке <time.h> обÑÑвлÑеÑÑÑ Ð½Ð°Ð±Ð¾Ñ ÑÑнкÑий, пÑедназнаÑеннÑÑ Ð´Ð»Ñ Ð²Ñзова ÑиÑÑемнÑÑ Ð¿Ð°ÑамеÑÑов вÑемени. Ðни могÑÑ Ð¿ÑименÑÑÑÑÑ Ð´Ð»Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¼ÐµÑÑного вÑемени и даÑÑ, вÑемени и даÑÑ Ð² ÑнивеÑÑалÑном ÑоÑмаÑе (UTC), а Ñакже ÑÑаÑиÑÑиÑеÑÐºÐ¸Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¾Ð± иÑполÑзовании пÑоÑеÑÑами вÑемени ÑенÑÑалÑного пÑоÑеÑÑоÑа. Рзаголовке <assert.h> обÑÑвлÑеÑÑÑ Ð¼Ð°ÐºÑокоманда, иÑполÑзÑÐµÐ¼Ð°Ñ Ð´Ð»Ñ Ð¿ÑовеÑки некоÑоÑÑÑ ÑÑловий вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿ÑоÑеÑÑа, коÑоÑÑе в ноÑмалÑной ÑиÑÑаÑии вÑегда Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¸ÑÑиннÑ. ÐÑли вÑе же во вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿ÑоÑеÑÑа ÑÑловие не вÑполнÑеÑÑÑ, Ñо макÑокоманда вÑÐ²Ð¾Ð´Ð¸Ñ ÑообÑение об оÑибке в ÑÑандаÑÑнÑй поÑок оÑибок Ñ Ñказанием Ñой ÑÑÑоки иÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ñайла, в коÑоÑой наÑÑÑаеÑÑÑ Ð¿ÑовеÑÑемое ÑÑловие. ÐоÑле ÑÑого макÑокоманда пÑеÑÑÐ²Ð°ÐµÑ Ð¿ÑоÑеÑÑ. Рзаголовке <setjmp.h> обÑÑвлÑеÑÑÑ Ð½Ð°Ð±Ð¾Ñ ÑÑнкÑий, коÑоÑÑе позволÑÑÑ Ð¿ÑоÑеÑÑÑ Ð²ÑзÑваÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ Ð¿ÐµÑÐµÑ Ð¾Ð´Ð° goto из одной ÑÑнкÑии в дÑÑгÑÑ. ÐÑзов Си-опеÑаÑоÑа goto позволÑÐµÑ Ð¿ÑоÑеÑÑÑ Ð¿ÐµÑедаÑÑ ÑпÑавление вÑполнением Ð¾Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ опеÑаÑоÑа к дÑÑÐ³Ð¾Ð¼Ñ Ð»Ð¸ÑÑ Ð² ÑÐ°Ð¼ÐºÐ°Ñ ÑÑой же ÑÑнкÑии. ФÑнкÑии, опÑеделеннÑе в заголовке <setjmp.h> ÑÑÑÑанÑÑÑ Ð´Ð°Ð½Ð½Ð¾Ðµ огÑаниÑение. ÐÑи ÑÑнкÑии Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ иÑполÑзоваÑÑ Ð»Ð¸ÑÑ Ñогда, когда без Ð½Ð¸Ñ Ð´ÐµÐ¹ÑÑвиÑелÑно нелÑÐ·Ñ Ð¾Ð±Ð¾Ð¹ÑиÑÑ. ÐапÑимеÑ, еÑли оÑибка обнаÑÑжена в ÑекÑÑÑивной ÑÑнкÑии, Ñо еÑÑÑ ÑмÑÑл ÑообÑиÑÑ Ð¾Ð± оÑибке, а заÑем вÑполниÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ Ð¿ÐµÑÐµÑ Ð¾Ð´Ð° goto в оÑновнÑÑ ÑÑнкÑиÑ, Ñ.е. как Ð±Ñ Ð½Ð°ÑаÑÑ Ð¿ÑоÑеÑÑ ÑнаÑала. Рзаголовке <pwd.h> опÑеделÑеÑÑÑ Ð½Ð°Ð±Ð¾Ñ ÑÑнкÑий, пÑедназнаÑеннÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÑÑеÑной инÑоÑмаÑии о полÑзоваÑелÑÑ . Рзаголовке <grp.h> опÑеделÑеÑÑÑ Ð½Ð°Ð±Ð¾Ñ ÑÑнкÑий, пÑедназнаÑеннÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÑÑеÑной инÑоÑмаÑии о гÑÑÐ¿Ð¿Ð°Ñ , ÑодеÑжаÑейÑÑ Ð² UNIX-Ñайле /etc/group. Рзаголовке <crypt.h> обÑÑвлÑеÑÑÑ Ð½Ð°Ð±Ð¾Ñ ÑÑнкÑий, пÑедназнаÑеннÑÑ Ð´Ð»Ñ ÑиÑÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ деÑиÑÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ . ÐÑо оÑÐµÐ½Ñ Ð²Ð°Ð¶Ð½Ñе ÑÑнкÑии, обеÑпеÑиваÑÑие безопаÑноÑÑÑ ÑиÑÑемÑ. ÐапÑимеÑ, ÑÐ°Ð¹Ð»Ñ Ð¿Ð¾Ð»ÑзоваÑелÑÑÐºÐ¸Ñ Ð¿Ð°Ñолей и ÑиÑÑемнÑÑ Ð´Ð°Ð½Ð½ÑÑ , коÑоÑÑм Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð° вÑÑÐ¾ÐºÐ°Ñ ÑÑÐµÐ¿ÐµÐ½Ñ Ð·Ð°ÑиÑÑ, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð·Ð°ÑиÑÑÐ¾Ð²Ð°Ð½Ñ Ñак, ÑÑÐ¾Ð±Ñ Ð½Ð¸ один Ñеловек, не имеÑÑий ÑпеÑиалÑного ÑазÑеÑениÑ, не мог ÑзнаÑÑ, ÑÑо они из ÑÐµÐ±Ñ Ð¿ÑедÑÑавлÑÑÑ. Ðолее Ñого, ÑÑÐ¾Ð±Ñ ÑиÑаÑÑ Ð¸ изменÑÑÑ ÑÑи обÑекÑÑ, ÑполномоÑеннÑе лиÑа Ð´Ð¾Ð»Ð¶Ð½Ñ Ð·Ð½Ð°ÑÑ ÑекÑеÑнÑе клÑÑи деÑиÑÑовки. ÐоÑÑÑп в библиоÑÐµÐºÑ ÑзÑка СиÐолÑÑение доÑÑÑпа к библиоÑеке завиÑÐ¸Ñ Ð¾Ñ ÑиÑÑемÑ. Ðо-пеÑвÑÑ , еÑÑÑ Ð½ÐµÑколÑко ÑазлиÑнÑÑ Ð¼ÐµÑÑ ÑаÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑеÑнÑÑ ÑÑнкÑий, ÐапÑимеÑ, getchar( ) обÑÑно задаÑÑ ÐºÐ°Ðº макÑоопÑеделение в Ñайле stdio.h, в Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº strlen( ) обÑÑно Ñ ÑаниÑÑÑ Ð² библиоÑеÑном Ñайле. Ðо-вÑоÑÑÑ , ÑазлиÑнÑе ÑиÑÑÐµÐ¼Ñ Ð¸Ð¼ÐµÑÑ ÑазнÑе ÑпоÑÐ¾Ð±Ñ Ð´Ð¾ÑÑÑпа к ÑÑим ÑÑнкÑиÑм. ÐÐ¾Ñ ÑÑи из Ð½Ð¸Ñ . ÐвÑомаÑиÑеÑкий доÑÑÑпÐо Ð¼Ð½Ð¾Ð³Ð¸Ñ Ð±Ð¾Ð»ÑÑÐ¸Ñ ÑиÑÑÐµÐ¼Ð°Ñ UNIX Ð²Ñ ÑолÑко компилиÑÑеÑе пÑогÑаммÑ. РдоÑÑÑп к более обÑим библиоÑеÑнÑм ÑÑнкÑиÑм вÑполнÑеÑÑÑ Ð°Ð²ÑомаÑиÑеÑки. ÐклÑÑение ÑайлаÐÑли ÑÑнкÑÐ¸Ñ Ð·Ð°Ð´Ð°Ð½Ð° как макÑоопÑеделение, Ñо можно диÑекÑивой #include вклÑÑиÑÑ Ñайл, ÑодеÑжаÑий ее опÑеделение. ЧаÑÑо подобнÑе ÑÑнкÑии могÑÑ Ð±ÑÑÑ ÑобÑÐ°Ð½Ñ Ð² ÑооÑвеÑÑÑвÑÑÑим обÑазом названнÑй заголовоÑнÑй Ñайл. ÐапÑимеÑ, некоÑоÑÑе ÑиÑÑÐµÐ¼Ñ Ð¸Ð¼ÐµÑÑ Ñайл ctype.h, ÑодеÑжаÑий макÑоопÑеделениÑ, задаÑÑие Ñип Ñимвола (пÑопиÑÐ½Ð°Ñ Ð±Ñква, ÑиÑÑа и Ñ.д.) ÐклÑÑение библиоÑекиÐа некоÑоÑом ÑÑапе компилÑÑии или загÑÑзки пÑогÑÐ°Ð¼Ð¼Ñ Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе вÑбÑаÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑекÑ. Ðаже ÑиÑÑема, коÑоÑÐ°Ñ Ð°Ð²ÑомаÑиÑеÑки конÑÑолиÑÑÐµÑ ÑÐ²Ð¾Ñ ÑÑандаÑÑнÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑекÑ, Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ Ð´ÑÑгие библиоÑеки Ñедко пÑименÑемÑÑ ÑÑнкÑий, и ÑÑи библиоÑеки ÑледÑÐµÑ Ð·Ð°Ð¿ÑаÑиваÑÑ Ñвно, ÑказÑÐ²Ð°Ñ ÑооÑвеÑÑÑвÑÑÑий пÑизнак во вÑÐµÐ¼Ñ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑии. ÐÑевидно, Ð¼Ñ Ð½Ðµ Ñможем ÑаÑÑмоÑÑеÑÑ Ð²Ñе оÑобенноÑÑи вÑÐµÑ ÑиÑÑем, но ÑÑи ÑÑи пÑимеÑа показÑваÑÑ, ÑÑо Ð²Ð°Ñ Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ! СвÑÐ·Ñ Ñ ÑайламиÐдин ÑпоÑоб оÑганизаÑии ÑвÑзи пÑогÑÐ°Ð¼Ð¼Ñ Ñ Ñайлом заклÑÑаеÑÑÑ Ð² иÑполÑзовании опеÑаÑий пеÑеклÑÑÐµÐ½Ð¸Ñ < и >. ÐÑÐ¾Ñ Ð¼ÐµÑод пÑоÑÑ, но огÑаниÑен. ЯзÑк Си пÑедоÑÑавлÑÐµÑ Ð¸ более моÑнÑе меÑÐ¾Ð´Ñ ÑвÑзи Ñ Ñайлами. РаÑÑмоÑÑим иÑполÑзование ÑÑнкÑии fopen( ), коÑоÑÐ°Ñ Ð¾ÑкÑÑÐ²Ð°ÐµÑ Ñайл, заÑем пÑименÑÑÑÑÑ ÑпеÑиалÑнÑе ÑÑнкÑии ввода-вÑвода Ð´Ð»Ñ ÑÑÐµÐ½Ð¸Ñ Ñайла или запиÑи в ÑÑÐ¾Ñ Ñайл и далее иÑполÑзÑеÑÑÑ ÑÑнкÑÐ¸Ñ fclose( ) Ð´Ð»Ñ Ð·Ð°ÐºÑÑÑÐ¸Ñ Ñайла. ÐÑежде Ñем иÑÑледоваÑÑ ÑÑи ÑÑнкÑии, кÑаÑко познакомимÑÑ Ñ ÑÑÑноÑÑÑÑ Ñайла. Файл ÑвлÑеÑÑÑ ÑаÑÑÑÑ Ð¿Ð°Ð¼ÑÑи, обÑÑно на диÑке, Ñо Ñвоим именем. ÐÑ ÑÑиÑаем, ÑÑо он ÑодеÑÐ¶Ð¸Ñ Ð½ÐµÐºÐ¾ÑоÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½ÑÑ Ð¸Ð½ÑоÑмаÑиÑ. ÐÐ»Ñ Ð¾Ð¿ÐµÑаÑионной ÑиÑÑÐµÐ¼Ñ Ñайл более Ñложен, но ÑÑо ÑиÑÑемнÑе пÑоблемÑ, а не наÑи. Ðо Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð·Ð½Ð°ÑÑ, ÑÑо ознаÑÐ°ÐµÑ Ñайл Ð´Ð»Ñ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ Ð½Ð° ÑзÑке Си. РпÑедлагаемÑÑ Ð´Ð»Ñ Ð¾Ð±ÑÑÐ¶Ð´ÐµÐ½Ð¸Ñ ÑÑнкÑиÑÑ , ÑабоÑаÑÑÐ¸Ñ Ñ Ñайлами, ÑзÑк Си ÑаÑÑмаÑÑÐ¸Ð²Ð°ÐµÑ Ñайл как ÑÑÑÑкÑÑÑÑ. ÐÐ¾Ñ ÑипиÑнÑй пÑимеÑ, взÑÑÑй из IBM-веÑÑии компилÑÑоÑа Lattice C: struct_iobuf { char*_ptr; /* ÑекÑÑий ÑказаÑÐµÐ»Ñ Ð±ÑÑеÑа*/ int_cnt; /* ÑекÑÑий ÑÑеÑÑик байÑов*/ char*_base; /* базовÑй адÑÐµÑ Ð±ÑÑеÑа ввода-вÑвода*/ char_flag; /* ÑпÑавлÑÑÑий пÑизнак*/ char_file; /* Ð½Ð¾Ð¼ÐµÑ Ñайла*/ } #define FILE struct_iobuf /* кÑаÑÐºÐ°Ñ Ð·Ð°Ð¿Ð¸ÑÑ*/ ÐдеÑÑ Ð¼Ñ Ð½Ðµ ÑобиÑаемÑÑ ÑазбиÑаÑÑÑÑ Ð´ÐµÑалÑно в ÑÑом опÑеделении. Ðлавное ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо Ñайл ÑвлÑеÑÑÑ ÑÑÑÑкÑÑÑой, и ÑÑо кÑаÑкое наименование Ñаблона - FILE. Ðногие ÑиÑÑÐµÐ¼Ñ Ð¸ÑполÑзÑÑÑ Ð´Ð¸ÑекÑÐ¸Ð²Ñ typedef Ð´Ð»Ñ ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑого ÑооÑвеÑÑÑвиÑ. Таким обÑазом, пÑогÑамма, имеÑÑÐ°Ñ Ð´ÐµÐ»Ð¾ Ñ Ñайлами, бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ Ñип ÑÑÑÑкÑÑÑÑ FILE, ÑÑÐ¾Ð±Ñ Ð´ÐµÐ»Ð°ÑÑ Ñак. РаÑÑмоÑÑим пÑÐ¸Ð¼ÐµÑ ÑÑÐµÐ½Ð¸Ñ ÑодеÑжимого Ñайла, названного File, и вÑвода его на ÑкÑан: #include <stdio.h> main( ) { FILE *in; /* опиÑÑваем ÑказаÑÐµÐ»Ñ Ð½Ð° Ñайл */ int ch; if ((in = fopen("File", "r") ) != NULL) { /* оÑкÑÑваем File Ð´Ð»Ñ ÑÑениÑ, пÑовеÑÑÑ ÑÑÑеÑÑвÑÐµÑ Ð»Ð¸ он */ /* ÑказаÑÐµÐ»Ñ FILE ÑÑÑлаеÑÑÑ ÑепеÑÑ Ð½Ð° File */ while ((ch = getc(in)) != EOF) /* полÑÑаем Ñимвол из in */ putc(ch, stdout); /* поÑÑлаем ch на ÑÑандаÑÑнÑй вÑвод*/ fclose(in); /* закÑÑваем Ñайл */ } else printf (" Файл не оÑкÑÑваеÑÑÑ\"File\".\n"); } ÐбÑÑÑним ÑабоÑÑ: fopen( ), fclose и иÑполÑзование ÑÑнкÑий ввода-вÑвода Ñайла. ÐÑкÑÑÑие Ñайла: fopen( )ФÑнкÑией fopen( ) ÑпÑавлÑÑÑ ÑÑи оÑновнÑÑ Ð¿Ð°ÑамеÑÑа. ÐеÑвÑй - Ð¸Ð¼Ñ Ñайла, коÑоÑÑй ÑледÑÐµÑ Ð¾ÑкÑÑÑÑ. Ðн ÑвлÑеÑÑÑ Ð¸ пеÑвÑм аÑгÑменÑом fopen( ). РнаÑем пÑимеÑе ÑÑо "File". ÐÑоÑой паÑамеÑÑ Ð¾Ð¿Ð¸ÑÑваеÑ, как должен иÑполÑзоваÑÑÑÑ Ñайл: "r" - Ñайл нÑжно ÑÑиÑаÑÑ, "w" - Ñайл нÑжно запиÑаÑÑ, "a" - Ñайл нÑжно дополниÑÑ. "w+" - новÑй ÑекÑÑовÑй Ñайл оÑкÑÑваеÑÑÑ Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи и поÑледÑÑÑÐ¸Ñ Ð¼Ð½Ð¾Ð³Ð¾ÐºÑаÑнÑÑ Ð¸ÑпÑавлений. ÐÑли Ñайл Ñже ÑÑÑеÑÑвÑеÑ, Ñо пÑедÑдÑÑее ÑодеÑжимое ÑÑиÑаеÑÑÑ. ÐоÑледÑÑÑие поÑле оÑкÑÑÑÐ¸Ñ Ñайла запиÑÑ Ð¸ ÑÑение из него допÑÑÑÐ¸Ð¼Ñ Ð² лÑбом меÑÑе Ñайла, в Ñом ÑиÑле запиÑÑ ÑазÑеÑена и в конÑе Ñайла, Ñ.е. Ñайл Ð¼Ð¾Ð¶ÐµÑ ÑвелиÑиваÑÑÑÑ. "r+" - ÑÑÑеÑÑвÑÑÑий ÑекÑÑовÑй Ñайл оÑкÑÑваеÑÑÑ ÐºÐ°Ðº Ð´Ð»Ñ ÑÑениÑ, Ñак и Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи в лÑбом меÑÑе Ñайла; однако в ÑÑом Ñежиме невозможна запиÑÑ Ð² ÐºÐ¾Ð½ÐµÑ Ñайла, Ñо еÑÑÑ Ð½ÐµÐ´Ð¾Ð¿ÑÑÑимо ÑвелиÑение ÑазмеÑов Ñайла. "a+" - ÑекÑÑовÑй Ñайл оÑкÑÑваеÑÑÑ Ð¸Ð»Ð¸ ÑоздаеÑÑÑ, еÑли Ñайла неÑ, и ÑÑановиÑÑÑ Ð´Ð¾ÑÑÑпнÑм Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹, Ñ.е. Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи и Ð´Ð»Ñ ÑÑÐµÐ½Ð¸Ñ Ð² лÑбом меÑÑе; пÑи ÑÑом в оÑлиÑие Ð¾Ñ Ñежима "w+"можно оÑкÑÑÑÑ ÑÑÑеÑÑвÑÑÑий Ñайл и не ÑниÑÑожаÑÑ ÐµÐ³Ð¾ ÑодеÑжимое; в оÑлиÑие Ð¾Ñ Ñежима "r+" в Ñежиме "a+" можно веÑÑи запиÑÑ Ð² ÐºÐ¾Ð½ÐµÑ Ñайла, Ñо еÑÑÑ ÑвелиÑиваÑÑ ÐµÐ³Ð¾ ÑазмеÑÑ. ÐекоÑоÑÑе ÑиÑÑÐµÐ¼Ñ Ð¿ÑедоÑÑавлÑÑÑ ÐµÑе дополниÑелÑнÑе возможноÑÑи, коÑоÑÑе Ð¼Ñ Ð·Ð´ÐµÑÑ Ð½Ðµ бÑдем ÑаÑÑмаÑÑиваÑÑ. ÐÑполÑзÑемÑе ÐºÐ¾Ð´Ñ ÑвлÑÑÑÑÑ ÑÑÑоками, а не ÑимволÑнÑми конÑÑанÑами. ÐÑи пÑименении "r" оÑкÑÑваеÑÑÑ ÑÑÑеÑÑвÑÑÑий Ñайл. ÐÑи двÑÑ Ð´ÑÑÐ³Ð¸Ñ Ð¿ÑименениÑÑ Ñоже бÑÐ´ÐµÑ Ð¾ÑкÑÑваÑÑÑÑ ÑÑÑеÑÑвÑÑÑий Ñайл, но еÑли Ñакого Ñайла неÑ, он бÑÐ´ÐµÑ Ñоздан. ÐÑли Ð²Ñ Ð¸ÑполÑзÑеÑе "w" Ð´Ð»Ñ ÑÑÑеÑÑвÑÑÑего Ñайла, Ñо ÑÑаÑÐ°Ñ Ð²ÐµÑÑÐ¸Ñ ÐµÐ³Ð¾ ÑÑиÑаеÑÑÑ, и ваÑа пÑогÑамма наÑÐ¸Ð½Ð°ÐµÑ Ð·Ð°Ð¿Ð¸ÑÑваÑÑ Ð½Ð° ÑиÑÑое меÑÑо. ТÑеÑий паÑамеÑÑ ÑвлÑеÑÑÑ ÑказаÑелем на Ñайл. ÐÑо знаÑение возвÑаÑаеÑÑÑ Ñамой ÑÑнкÑией: FILE *in; in=fopen("File","r"); ТепеÑÑ in ÑвлÑеÑÑÑ ÑказаÑелем на Ñайл "File". С ÑÑого моменÑа пÑогÑамма ÑÑÑлаеÑÑÑ Ð½Ð° Ñайл пÑи помоÑи ÑказаÑÐµÐ»Ñ in, а не по имени File. (Файл stdio.h ÑодеÑÐ¶Ð¸Ñ ÑÑÑÐ¾ÐºÑ FILE *fopen( ) ÐÑли fopen( ) не ÑпоÑобна оÑкÑÑÑÑ ÑÑебÑемÑй Ñайл, она возвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение NULL, опÑеделенное в stdio.h как 0. ÐакÑÑÑие Ñайла: fclose( )РнаÑем пÑимеÑе показано, как нÑжно закÑÑваÑÑ Ñайл: fclose(in); ÐÑгÑÐ¼ÐµÐ½Ñ ÑÑнкÑии ÑвлÑеÑÑÑ ÑказаÑелем на Ñайл. ÐÐ»Ñ Ð±Ð¾Ð»ÐµÐµ ÑеÑÑезной пÑогÑÐ°Ð¼Ð¼Ñ Ð½Ñжно ÑмоÑÑеÑÑ, ÑÑпеÑно ли закÑÑÑ Ñайл. ФÑнкÑÐ¸Ñ fclose( ) возвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение 0, еÑли Ñайл закÑÑÑ ÑÑпеÑно, и EOF в пÑоÑивном ÑлÑÑае. ТекÑÑовÑе ÑÐ°Ð¹Ð»Ñ Ñ Ð±ÑÑеÑизаÑиейФÑнкÑии fopen( ) и fclose( ) ÑабоÑаÑÑ Ñ ÑекÑÑовÑми Ñайлами Ñ "бÑÑеÑизаÑией". Ðод бÑÑеÑизаÑией Ð¼Ñ Ð¿Ð¾Ð½Ð¸Ð¼Ð°ÐµÐ¼, ÑÑо вводимÑе и вÑводимÑе даннÑе запоминаÑÑÑÑ Ð²Ð¾ вÑеменной облаÑÑи памÑÑи, назÑваемой бÑÑеÑом. ÐÑли бÑÑÐµÑ Ð·Ð°Ð¿Ð¾Ð»Ð½Ð¸Ð»ÑÑ, ÑодеÑжимое его пеÑедаеÑÑÑ Ð² блок, и пÑоÑеÑÑ Ð±ÑÑеÑизаÑии наÑинаеÑÑÑ Ñнова. Ðдна из оÑновнÑÑ Ð·Ð°Ð´Ð°Ñ fclose( ) заклÑÑаеÑÑÑ Ð² Ñом, ÑÑÐ¾Ð±Ñ Ð¾ÑвободиÑÑ Ð»ÑбÑе ÑаÑÑиÑно заполненнÑе бÑÑеÑÑ, еÑли Ñайл закÑÑÑ. ТекÑÑовÑм ÑÑиÑаеÑÑÑ Ñайл, в коÑоÑом инÑоÑмаÑÐ¸Ñ Ð·Ð°Ð¿Ð¾Ð¼Ð¸Ð½Ð°ÐµÑÑÑ Ð² виде Ñимволов в коде ASCII или аналогиÑном. ТекÑÑовÑй Ñайл оÑлиÑаеÑÑÑ Ð¾Ñ Ð´Ð²Ð¾Ð¸Ñного Ñайла, коÑоÑÑй обÑÑно иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð·Ð°Ð¿Ð¾Ð¼Ð¸Ð½Ð°Ð½Ð¸Ñ ÐºÐ¾Ð´Ð¾Ð² маÑинного ÑзÑка. Ðвод-вÑвод ÑекÑÑового Ñайла: getc( ), putc( )Ðве ÑÑнкÑии getc( ) и putc( ) ÑабоÑаÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñно ÑÑнкÑиÑм getchar( ) и putchar( ) (опиÑаннÑм в пÑедÑдÑÑÐ¸Ñ Ð»ÐµÐºÑиÑÑ ). РазниÑа заклÑÑаеÑÑÑ Ð² Ñом, ÑÑо Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑообÑиÑÑ, какой Ñайл ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ. char ch; ch=getchar( ); пÑедназнаÑена Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ñимвола Ð¾Ñ ÑÑандаÑÑного ввода, а ch=getc(in); - Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ñимвола Ð¾Ñ Ñайла, на коÑоÑÑй ÑказÑÐ²Ð°ÐµÑ in. putchar(ch); вÑÐ²Ð¾Ð´Ð¸Ñ Ñимвол на ÑÑандаÑÑнÑй Ñайл вÑвода. putc(ch,t); пÑедназнаÑена Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи Ñимвола ch в Ñайл, на коÑоÑÑй ÑÑÑлаеÑÑÑ ÑказаÑÐµÐ»Ñ t Ñипа FILE. Ðвод-вÑвод Ñайла: fprintf( ), fscanf( ), fgets( ), fputs( )ÐÑе ÑÑнкÑии ввода-вÑвода, коÑоÑÑе Ð¼Ñ Ð¸ÑполÑзовали в пÑедÑдÑÑÐ¸Ñ Ð»ÐµÐºÑиÑÑ , имеÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸ Ð´Ð»Ñ Ð²Ð²Ð¾Ð´Ð°-вÑвода Ñайла. ÐÑновное оÑлиÑие ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо нам нÑжно иÑполÑзоваÑÑ ÑказаÑÐµÐ»Ñ Ñипа FILE , ÑÑÐ¾Ð±Ñ ÑообÑиÑÑ ÑÑнкÑиÑм Ñ ÐºÐ°ÐºÐ¸Ð¼ Ñайлом им ÑледÑÐµÑ ÑабоÑаÑÑ. Ðодобно getc( ) и putc( ) ÑÑи ÑÑнкÑии иÑполÑзÑÑÑÑÑ Ð¿Ð¾Ñле ÑÑнкÑии fopen( ), оÑкÑÑваÑÑей Ñайл, и пеÑед fclose( ), закÑÑваÑÑей его. ФÑнкÑии fprintf( ) и fscanf( )ÐÑи ÑÑнкÑии ввода-вÑвода ÑабоÑаÑÑ Ð¿Ð¾ÑÑи как printf( ) и scanf( ) (Ñм. лекÑÐ¸Ñ 4), но им нÑжен дополниÑелÑнÑй аÑгÑÐ¼ÐµÐ½Ñ Ð´Ð»Ñ ÑÑÑлки на Ñам Ñайл. Ðн ÑвлÑеÑÑÑ Ð¿ÐµÑвÑм в ÑпиÑке аÑгÑменÑов. ÐÑимеÑ, иллÑÑÑÑиÑÑÑÑий обÑаÑение к ÑÑим ÑÑнкÑиÑм: #include <stdio.h> main( ) { FILE *fi; int age; fi=fopen("File","r"); /* ÑÑиÑÑвание */ fscanf(fi,"%d",&age); /* fi ÑказÑÐ²Ð°ÐµÑ Ð½Ð° File */ fclose(fi); fi=fopen("Data", "a"); /*дополнение*/ fprintf(fi,"Data is %d.\n",age); /*fi ÑказÑÐ²Ð°ÐµÑ Ð½Ð° Data*/ fclose(fi); } РоÑлиÑие Ð¾Ñ getc( ) и putc( ) ÑÑи ÑÑнкÑии полÑÑаÑÑ ÑказаÑÐµÐ»Ñ Ñипа FILE в каÑеÑÑве пеÑвого аÑгÑменÑа. ФÑнкÑÐ¸Ñ fgets( )ÐÑа ÑÑнкÑÐ¸Ñ Ð¸Ð¼ÐµÐµÑ ÑÑи аÑгÑменÑа, в Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº gets( ) Ð¸Ð¼ÐµÐµÑ Ð»Ð¸ÑÑ Ð¾Ð´Ð¸Ð½. ÐÑÐ¸Ð¼ÐµÑ ÐµÐµ иÑполÑзованиÑ: /* ÐÑогÑамма ÑÑиÑÑÐ²Ð°ÐµÑ Ñайл ÑÑÑока за ÑÑÑокой */ #include <stdio.h> #define MAX 80 main( ) { FILE *f1; char *string[MAX]; f1=fopen("File","r"); while (fgets(string,MAX,f1) != NULL) puts(string); } ÐÑ ÑаÑположили вводимÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð² ÑимволÑном маÑÑиве string. ÐеÑвÑй из ÑÑÐµÑ Ð°ÑгÑменÑов ÑÑнкÑии fgets( ) ÑвлÑеÑÑÑ ÑказаÑелем на меÑÑоположение ÑÑиÑÑваемой ÑÑÑоки. ÐÑоÑой аÑгÑÐ¼ÐµÐ½Ñ ÑодеÑÐ¶Ð¸Ñ Ð¿ÑеделÑнÑÑ Ð´Ð»Ð¸Ð½Ñ ÑÑиÑÑваемой ÑÑÑоки. ФÑнкÑÐ¸Ñ Ð¿ÑекÑаÑÐ°ÐµÑ ÑабоÑÑ Ð¿Ð¾Ñле ÑÑиÑÑÐ²Ð°Ð½Ð¸Ñ Ñимвола новой ÑÑÑоки или поÑле ÑÑиÑÑÐ²Ð°Ð½Ð¸Ñ Ñимволов обÑим ÑиÑлом MAX-1, в завиÑимоÑÑи Ð¾Ñ Ñого, ÑÑо пÑÐ¾Ð¸Ð·Ð¾Ð¹Ð´ÐµÑ ÑанÑÑе. РлÑбом ÑлÑÑае нÑлÑ-Ñимвол '\0' добавлÑеÑÑÑ Ð² ÑамÑй ÐºÐ¾Ð½ÐµÑ ÑÑÑоки. ТÑеÑий аÑгÑÐ¼ÐµÐ½Ñ ÑказÑÐ²Ð°ÐµÑ Ð½Ð° Ñайл, коÑоÑÑй бÑÐ´ÐµÑ ÑиÑаÑÑÑÑ. РазниÑа Ð¼ÐµÐ¶Ð´Ñ gets( ) и fgets( ) заклÑÑаеÑÑÑ Ð² Ñом, ÑÑо gets( ) заменÑÐµÑ Ñимвол новой ÑÑÑоки на '\0', в Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº fgets( ) ÑÐ¾Ñ ÑанÑÐµÑ Ñимвол новой ÑÑÑоки. Ðодобно gets( ) ÑÑнкÑÐ¸Ñ fgets( ) возвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение NULL, еÑли вÑÑÑеÑÐ°ÐµÑ Ñимвол EOF . ÐÑо позволÑÐµÑ Ð½Ð°Ð¼ пÑовеÑиÑÑ, доÑÑигли ли Ð¼Ñ ÐºÐ¾Ð½Ñа Ñайла. ФÑнкÑÐ¸Ñ fputs( )ÐÑа ÑÑнкÑÐ¸Ñ Ð¿Ð¾Ñ Ð¾Ð¶Ð° на ÑÑнкÑÐ¸Ñ puts( ). ÐпеÑаÑÐ¾Ñ l=fputs("СÑÑока", fi);
ÐеÑÐµÐ´Ð°ÐµÑ ÑÑÑÐ¾ÐºÑ "СÑÑока" в Ñайл, на коÑоÑÑй ÑÑÑлаеÑÑÑ ÑказаÑÐµÐ»Ñ fi Ñипа FILE. ÐонеÑно, ÑнаÑала нÑжно оÑкÑÑÑ ß W ê · ! á T W . ¾ q ý ß ê · ! á K 5 7 3 # N 7 5 - 7 6 < |