|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Строковый обмен с файламиСтроковый обмен с файлами. Для работы с текстовыми файлами, кроме перечисленных выше, удобно использовать функции fgets() и fputs(). Прототипы этих функций в файле stdio.h имеют следующий вид: int fputs(const char * s, FILE *stream); char * fgets(char * s, int n, FILE *stream);
Функция fputs() записывает ограниченную символом '\0' строку (на которую указывает s) в файл, определенный указателем stream на поток, и возвращает неотрицательное целое. При ошибках функция возвращает EOF. Символ '\0' в файл не переносится, и символ '\n' не записывается в конце строки вместо '\0'. Функция fgets() читает из определенного указателем stream файла не более (n-1) символов и записывает их в строку, на которую указывает s. Функция прекращает чтение, как только прочтет (n-1) символов или встретит символ новой строки '\n', который переносится в строку s. Дополнительно в конец каждой строки записывается признак окончания строки '\0'. В случае успешного завершения функция возвращает указатель s. При ошибке или при достижении конца файла, при условии, что из файла не прочитан ни один символ, возвращается значение NULL. В этом случае содержимое массива, который адресуется указателем s, остается без изменений. Напомним, что в отличие от fgets() функция gets() отбрасывает символ '\n'. Проиллюстрируем возможности указанных функций на программе, которая переписывает текст из одного файла в другой. На этом же примере еще раз проиллюстрируем особенность языка Си - возможность передачи информации в выполняемую программу из командной строки (см. §5.8). В стандарте языка Си определено, что любая программа на языке Си при запуске на выполнение получает от операционной системы информацию в виде значений двух аргументов - argc (сокращение от argument count - счетчик аргументов) и argv (сокращение от argument vector). Первый из них определяет количество строк, передаваемых в виде массива указателей argv. По принятому соглашению argv[0] это всегда указатель на строку, содержащую полное имя файла с выполняемой программой. Остальные элементы массива argv[l],...,argv[argc-l] содержат ссылки на параметры, записанные через пробелы в командной строке после имени программы. (Третий параметр char * envp[ ] мы уже рассмотрели в §5.8, но он используется весьма редко.) Предположим, что имя выполняемой программы copyfile.exe и мы хотим с ее помощью переписать содержимое файла fI.dat в файл f2.txt. Вызов программы из командной строки имеет вид:
Текст программы может быть таким:
Обратите внимание, что значение argc явно не задается, а определяется автоматически. Так как argv[0] определено всегда, то значение argc не может быть меньше 1. При отсутствии в командной строке двух аргументов (имен файлов ввода-вывода) значение argc оказывается не равным трем, и поэтому на экран выводится поясняющее сообщение:
Если имя входного файла указано неудачно или нет места на диске для создания выходного файла, то выдаются соответствующие сообщения:
или
Режим форматного обмена с файлами. В некоторых случаях информацию удобно записывать в файл в виде, пригодном для непосредственного (без преобразования) отображения на экран дисплея, т.е. в символьном виде. Например, для сохранения результатов работы программы, чтобы затем распечатать их на бумагу (получить "твердую" копию) или когда необходимо провести трассировку программы — вывести значения некоторых переменных во время выполнения программы для их последующего анализа. В этом случае можно воспользоваться функциями форматного ввода (вывода) в файл fprintf() и fscanf(), которые имеют следующие прототипы:
int fyrinlf (указатель_на_поток, форматная-строка, список-переменных); int fscanf (указатель_на_поток, форматная_строка, список_адресов_переменных);
Как и в функциях printf() и scanf(), форматная строка может быть определена вне вызова функции, а в качестве фактического параметра в этом случае будет указатель на нее. От рассмотренных выше функций printf(), scanf() для форматного обмена с дисплеем и клавиатурой функции fprintf() и fscanf() отличаются лишь тем, что в качестве первого параметра в них необходимо задавать указатель на поток, с которым производится обмен. В качестве примера приведем программу, создающую файл int.dat и записывающую в него символьные изображения чисел от 1 до 10 и их квадратов [9]:
В результате работы этой программы в файле int.dat формируется точно такая же "картинка", как и в том случае, если бы мы воспользовались вместо функции fprintf() функцией printf() для вывода результатов непосредственно на экран дисплея. В этом легко убедиться, воспользовавшись соответствующей обслуживающей программой операционной системы для вывода файла int.dat на экран дисплея. Несложно и самим написать такую программу, используя для форматного чтения данных из файла функцию fscanf():
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.005 сек.) |