Внутренняя передача данных (функции sscanf и sprintf) 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Внутренняя передача данных (функции sscanf и sprintf)



Эти функции являются функциями преобразования данных, а не ввода-вывода, однако правила преобразования те же, что и для соответствующих функций ввода-вывода.

Преобразование из символьной строки во внутреннее представление.

Прототип: int sscanf (char *buf, char *control, аргумент[, аргумент]...);

Здесь buf – исходная строка, control – управляющая строка.

Возвращаемое значение – см.функцию scanf.

Преобразование из внутреннего представления в символьную строку.

Прототип: int sprintf (char *buf, char *control, аргумент[, аргумент]...);

Файл прототипов обеих функций: stdio.h.

Возвращаемое значение: длина сформированной строки - число байтов без конечного 0, который добавляется или EOF (при ошибке).


Пример.

i=4;

a[ i ] = -37.45;

sprintf (mult, "<%12.5e%3s%d>", a[ i ], "x**",i);

Результат будет иметь вид: < -3.7450e+01x**4>.

Вопросы для самопроверки и контроля

Вопросы для самопроверки

1. Какие символы являются ограничителями ввода для спецификации s функции scanf?

2. Удаляются ли символы-ограничители из входного потока функцией gets?

3. Какой символ помещается в конец выводимой строки функцией puts?

4. Можно ли ввести строку, содержащую пробелы, функцией scanf?

Контрольные вопросы

1. Какой символ ограничивает ввод функции gets?

2. Что возвращает функция getchar при ошибке ввода?

3. Для чего можно использовать функции внутренней передачи данных?

4. Какие стандартные потоки определены в языке C?

 

ФАЙЛЫ

Основные понятия

Файл – это набор данных ограниченного объема, хранящийся на некотором носителе информации. Файлом можно назвать книгу, музыку, записанную на магнитной ленте, картину на холсте и многое другое. Однако исторически сложилось, что файлом называют наборы данных, которые можно обрабатывать средствами вычислительной техники. Основными носителями информации для них в настоящее время являются: "жесткий" диск, дискета, компакт-диск (CD ROM), магнитная лента, микросхемы.

По типу организации файлы делят на 2 основных вида: последовательные и файлы с прямым (произвольным) доступом. Последовательными называют файлы, в которых для доступа к нужному фрагменту информации необходимо просмотреть всю предыдущую информацию. Примером таких файлов является информация, записанная на магнитной ленте. Этот носитель может хранить только последовательные файлы. Однако последовательная организация файлов применяется и на носителях информации, где возможен произвольный доступ. Файлы с произвольным ( random ) доступом позволяют обратиться к нужному фрагменту, не просматривая предыдущую информацию. Очевидно, что для нахождения нужного фрагмента эти данные должны иметь некий, отличающий их от других фрагментов файла, признак (ключ).

Также принято различать текстовые и бинарные файлы. В текстовых файлах информация хранится в виде последовательности символов, обычно разбитой на отдельные строки. Бинарные файлы содержат данные во внутреннем представлении, т.е. в том виде, в котором они хранятся в памяти компьютера в соответствии с их типом (целые, с плавающей точкой и т.д.).

В данном разделе будут рассмотрены средства работы с последовательными текстовыми файлами, как с наиболее распространенными и простыми. Такие файлы могут быть подготовлены обычными редакторами текстов, например: NotePad (Блокнот) - ОС Windows и Norton Editor (ne), Borland C++ 3.1 – ОС MS DOS. В языке Basic для цели обмена информацией между приложением и внешней средой используются специальные инструкции, а в языке C – набор библиотечных функций.

Описание файла

Правила описания файлов зависят от операционной системы (ОС), однако традиционно это описание имеет вид:

<имя_файла>.< расширение>.

Пример.

квартплата.xls

В ОС MS DOS длина имени файла не должна превышать 8 символов и это имя не допускает спецсимволы и русские буквы. Длина расширения не более 3 символов. В ОС Windows длина имени файла меньше или равна 255 символов и русские символы допустимы. Расширение часто называют типом файла, поскольку многие программы, их создающие, имеют расширения по умолчанию.

К ним относятся:

- doc – текстовый процессор MS Word;

- xls – табличный процессор MS Excel;

- c – исходный модуль языка C;

- cpp – исходный модуль языка C++;

- bas – общий модуль языка Basic;

- frm – файл экранной формы программы на Basic;

- obj – объектный файл любого транслятора;

- exe – выполняемый файл;

- txt – текстовый файл, подготовленный редактором NotePad.

Заметим, что пользователь имеет возможность дать этим типам другое расширение. В ОС MS DOS трансляторы с языков C и C++ сохраняют предыдущую версию исходного текста программы в файле с расширением bak.

Открытие и закрытие файлов

Перед началом обмена данными с файлом выполняются операции:

- проверка наличия файла с данным именем при чтении;

- наличие свободного пространства на диске при создании файла;

- установка указателя файла на начало (позиционирование).

Этот процесс называют открытием файла. Как было показано выше в разделе 12, для обмена данными используются 3 стандартных потока. При открытии файла ОС присоединяет к нему свой индивидуальный поток (канал) передачи данных, который характеризуется целым числом, называемым дескриптором файла. В языке C функция открытия файла возвращает не дескриптор, а указатель на тип FILE, который представляет собой структуру, описанную в заголовочном файле stdio.h и содержащую в качестве элемента дескриптор файла. С каждым открытым потоком связан выделяемый ОС буфер передачи данных.

Процесс отсоединения файла от программы после окончания операций с ним называется закрытием файла. При этом освобождаются ресурсы (в основном, память). Файл закрывается указанием программиста либо по окончании работы программы. Рекомендуется закрывать файлы прямым указанием по следующим причинам:

- возможна случайная порча открытого файла из-за программных ошибок;

- часто требуется повторное открытие того же файла с другим способом обработки; например, файл сначала был открыт для записи в него информации, а в последующих фрагментах программы необходимо читать эти данные;

- при аварийном завершении программы информация, хранимая в сис-темном буфере пропадает.

Средства языка С

Прототипы всех функций обмена данных хранятся в файле stdio.h.

Открытие и закрытие файла

Прототип: FILE *fopen ( char * a, char *b ); - открытие файла.

Параметры:

- a – имя файла (полный путь);

- b – способ обработки:

- r – только чтение;

- w – только запись;

- a – только добавление в конец существующего файла.

Параметры способа обработки r и w могут дополняться символом +, который означает также и возможность изменения содержания файла.

Пример. w+ - создать файл и затем изменять.

Возвращаемое значение: указатель на файл (при нормальном открытии) | NULL (при ошибке).

Пример.

FILE *p; // Указатель на файл. Должен быть описан в программе

..................................

p= fopen ("u:\c_lections\examples\out.dat", "r");

 

Прототип: int fclose (FILE *); - закрытие файла.

Возвращаемое значение: 0 - нормальное закрытие | EOF - ошибка.

Основные функции обмена

Правила обращения к ним практически совпадают с ранее описанными для функций стандартных потоков ввода-вывода stdin и stdout. Появляется лишь дополнительный параметр – указатель на файл: FILE *.

Прототипы:

int fscanf(FILE *file, <управляющая_строка>,<список_данных>); См. scanf

int fprintf (FILE *file, <управляющая_строка>,[<список_данных>]); См. printf

int getc (FILE * file); - чтение одного символа. См. getchar

int putc ( int symb, FILE * file); - запись одного символа. См. putchar

char* fgets ( char * string, int max_len, FILE * file); Читает max_len-1 символ из файла или до символа '\ n' (если раньше встретится). Добавляет в конец прочитанной строки символ '\0' вместо символа '\ n '. См. gets

int fputs ( char * string, FILE * file); См. puts

Замечание. Символ '\0' в файл не записывается и символ '\ n ' не добавляется. Если в этом есть необходимость, следует добавлять символ '\ n ' самостоятельно.

Средства языка Basic

Открытие и закрытие файла

Инструкция open

Открывает файл.

Формат:

open <полный_путь> for <режим> as # <дескриптор>

Здесь:

- <полный путь> –строка в кавычках либо выражение, результатом вычисления которого является строка, указывающая путь к файлу;

- <режим> – это одно из ключевых слов:

- input – чтение;

- output – запись с начала (старая информация стирается);

- append – запись (добавление) в конец файла;

- <дескриптор> – идентификатор файла в программе – целое значение в диапазоне [1 - 511].

Инструкция open должна предшествовать всем инструкциям, непосредственно работающим с содержанием файла. Если файл, открываемый в режиме output или append не существует в момент открытия, то он создается в директории, заданной путем.

Пример.

open "u:\c_lections\examples\out.txt" for output as #5

open "u:\c_lections\examples\enter.txt" for input as #6

Инструкция close

Закрывает 1 или более файлов.

Формат:

close [ # <дескриптор>][, # <дескриптор>]...

Инструкция close без списка дескрипторов закрывает все открытые файлы.

Пример.

Close #5, #6

Работа с файлами

Инструкция input

Читает из файла элементы данных, записанные через разделители. Разделителем могут служить следующие символы: запятая, пробел(ы), табуляция, новая строка.

Формат:

input # <дескриптор> <переменная>[, <переменная>]...

Пример.

input # 5, x, y

for i=1 to 10

input # 6, arr(i)

Next

В список данных нельзя включать имена массивов. Разделители и ограничивающие строковые данные кавычки игнорируются.

Функция input

Читает из файла n символов.

Формат:

input ( n, <дескриптор>)

Пример.

input (FileSize, # 5)

В отличие от инструкции input читает все символы, в том числе и разделители.

Инструкция line input

Читает из файла текстовую строку целиком и присваивает ее значение переменной типа string или variant. Текстовая строка ограничена символом перевод строки.

Формат:

line input # <дескриптор>, <переменная>

Пример.

line input # 6, VarString

Инструкция write

Записывает значения элементов списка данных в одну текстовую строку. Элементы в файле разделяются запятыми, строки заключаются в кавычки, после записи последнего элемента списка данных заносится символ перевод строки.

Формат:

write # <дескриптор>, [<выражение>[, <выражение>]...]

Пример.

write # 5, x+2, i+1

При отсутствии списка данных в файл записывается пустая строка. Инструкцию write рекомендуется использовать, если файл затем будет читаться инструкцией input, поскольку она обеспечивает четкое разделение элементов данных.

Инструкция print

Также записывает значения элементов списка данных в файл. Основное отличие этой инструкции от инструкции write заключается в более широких возможностях расположения элементов данных в файле.

Формат:

print # <дескриптор>, [<список_данных>]

Разделителями элементов списка данных служат символы: ";" и ",". Если разделителем служит символ ";", то элемент данных записывается в файл через пробел от предыдущего. Если разделитель ",", то очередной элемент записывается с начала следующей зоны вывода. Зоны вывода начинаются с позиций 1, 15, 29,..., т.е. они образуют колонки шириной 14 позиций. Кроме того, список данных может содержать функции tab ([ n ]) и spc (n).

Функция tab ([ n ]) располагает очередной элемент, начиная с n -й позиции от начала строки. Если n < текущей позиции в файле, то элемент располагается с n -й позиции следующей строки. Функция tab без аргумента вставляет значение с начала очередной зоны вывода, т.е. ведет себя аналогично разделителю ",".

Функция spc (n) вставляет между очередными выводимыми значениями n пробелов.

Пример.

print # 5, "Координаты точки:"; x; spc (5); y

Инструкция width

Задает длину текстовой строки в файле.

Формат:

width # <дескриптор>, <длина>

Длина – целое выражение в диапазоне [0 – 255]. Если длина равна 0, то длина строки не ограничена. По умолчанию длина равна 0.

Пример.

width # 6, 70

print # 6, "Вектор – результат"

for i=1 to 10

print # 6, x(i),

Next

Содержимое файла будет иметь вид:

Вектор – результат

23 -45 -12 45 0

-6 -67 1 -34 21

Длина файла

Полезными могут оказаться 2 функции, возвращающие длину файла в байтах.

Длина неоткрытого файла: filelen (<путь>).

Длина открытого файла: lof (<дескриптор>).

Функция MsgBox

Эта функция не относится к функциям работы с файлами, но, поскольку необходимо, чтобы программа на языке Basic выдавала на экран информацию о ходе выполнения, она приводится в данном разделе. Функция MsgBox выдает на экран сообщение в диалоговом окне, ожидает нажатие пользователя на одну из кнопок окна и возвращает значение типа integer, равное № нажатой кнопки. Поскольку здесь эта функция нужна лишь для индикации хода выполнения программы, приводится упрощенное обращение к функции MsgBox, которое формирует окно сообщения с одной кнопкой "ОК".

Формат:

MsgBox (<сообщение>,, <заголовок>)

Пример.

MsgBox ("Длина последовательности:" & kol,,"Результат")

 

Если заголовок отсутствует, то вместо него выводится название приложения. Так как сообщение представляет собой текстовую строку, то при необходимости вывода нескольких значений (возможно числовых) следует применять оператор сцепления строк &.

Вопросы для самопроверки и контроля

Вопросы для самопроверки

1. В чем отличие последовательных файлов и файлов с произвольным доступом?

2. Что представляют файлы с расширением по умолчанию bak?

3. Что такое дескриптор файла?

4. Что означает запись FILE* в языке C?

5. Что делает инструкция close без параметров?

6. Укажите тип первого параметра функции MsgBox.

Контрольные вопросы

1. Чем отличаются текстовые и бинарные файлы?

2. Перечислите различия в правилах записи имен файлов ОС Windows и MS DOS?

3. Что представляет собой дескриптор файла в языке Basic?

4. Перечислите и поясните значения параметра способа обработки функции open?

5. Чем отличается использование инструкций write и print в языке Basic?

6. Какой параметр добавляется в функциях работы с файлами по сравнению со стандартными потоками?

 

СТРУКТУРА ПРОГРАММЫ

Любая программа на языке C или Basic состоит из одной или нескольких процедур, одна из которых должна иметь имя main. Она получает управление от операционной системы (ОС) и инициирует выполнение приложения. Ее нельзя вызвать из другой процедуры и параметры она может получать только от ОС. Напомним, что в языке C определен только один вид процедур – функции ( function ), в языке Basic – два: подпрограммы ( sub ) и функции ( function ). Главной процедурой в программе на языке Basic является подпрограмма sub.

Некоторые процедуры могут иметь общие данные и их разумно объединить в один фрагмент программы, назваемый модулем. Каждый модуль может компилироваться автономно и хранится на диске в виде отдельного файла. Для языка C этот файл имеет расширение .c, для языка Basic - .bas. Причинами разбиения программы на модули являются:

- борьба со сложностью,

- возможность подключения к программе ранее разработанных компонентов,

- длительность трансляции больших программ,

- бригадное программирование.

В языке C каждая функция может иметь дополнительный уровень структуры – блок. Блоки могут быть вложены друг в друга. Таким образом, элементами структуры программы являются: файл(модуль), процедура, блок.



Поделиться:


Последнее изменение этой страницы: 2017-02-08; просмотров: 572; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.221.146.223 (0.081 с.)