Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Внутренняя передача данных (функции 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, " %.5g%3s%d", a[ i ], " x**" , i );

Результат будет иметь вид: -37.45x**4


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

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

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

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

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

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

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

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

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

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

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

 

ФАЙЛЫ

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

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

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

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

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

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

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

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

Пример.

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

В ОС Windows длина имени файла меньше или равна 255 символам и русские символы допустимы. Расширение часто называют типом файла, поскольку многие программы, их создающие, имеют расширения по умолчанию.

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

- doc – текстовый процессор MS Word (с версии 2007 и выше – docx );

- xls – табличный процессор MS Excel (с версии 2007 и выше – xlsx );

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

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

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

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

- obj | o – объектный файл;

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

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

Заметим, что пользователь имеет возможность дать этим типам другое расширение. Трансляторы с языков 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 - ошибка.

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

Пример.

p=fopen(" out.dat", " r" );

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

if(p==NULL){

printf(“Ошибка открытия файла out.dat\n”);

exit(0); // Выход из задачи Прототип в файле stdlib.h

}

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

Правила обращения к ним практически совпадают с ранее описанными для функций стандартных потоков ввода-вывода 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 ' самостоятельно.

int feof(FILE *file); Возвращает ненулевое значение, если очередная операция чтения из файла не находит данных (достигается конец файла), поэтому такую проверку надо выполнять сразу за операцией чтения.

Пример.

fscanf(in, " %f%f%f", & a, & b, & eps);

if (feof(in)){

………….

}

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

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

Инструкция FileOpen

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

Формат:

Public Sub FileOpen( ByVal FileNumber As Integer, _ - дескриптор файла,

ByVal FileName As String, _ - полный путь к файлу,

ByVal Mode As OpenMode) - режим открытия.

Здесь:

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

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

- режим – значение из перечислимого типа OpenMode:

- input – чтение;

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

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

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

Если по указанному пути файл не найден, то во время выполнения выдается сообщение FileNotFoundException не обработано и программа прерывается.

Если файл, открываемый в режиме output или append не существует в момент открытия, то он создается в директории, заданной путем.

Пример.

FileOpen(5, " u: \c_lections\examples\out.txt", OpenMode.output)

FileOpen(6, " u: \c_lections\examples\enter.txt”, OpenMode.input)

При переносе задачи на другой компьютер с иной файловой структурой (другая вложенность и имена папок) удобно использовать не полный путь к открываемому файлу, а путь относительно папки, в которой создается exe файл приложения. В нашем случае, если открываемые файлы находятся в папке examples, то инструкции открытия примут вид:

FileOpen(5, "..\..\out.txt", OpenMode.output)

FileOpen(6, "..\..\enter.txt”, OpenMode.input)

Символы..\..\ означает подъем на 2 уровня выше по структуре вложенности папок, т.к. exe файл создается в папке examples\bin\debug.

Инструкция FileClose

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

Формат:

Public Sub FileClose( ParamArray FileNumbers() As Integer )

Массив параметров FileNumbers() содержит дескрипторы закрываемых файлов.

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

Пример.

FileClose(5, 6)

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

Инструкция Input

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

Формат:

Public Sub Input(FileNumber As Integer, _ - дескриптор файла,

ByRef Value As Object ) - переменная, которой назначается читаемое из файла значение.

Это не может быть массив или переменная типа object.

Пример.

Input(6, x): Input(6, y)

For i=1 To 10

Input(6, arr(i))

Next

Инструкция LineInput

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

Формат:

Public Function LineInput( ByVal FileNumber As Integer ) As String

Пример.

text=LineInput(6)


Поделиться:



Последнее изменение этой страницы: 2017-04-12; Просмотров: 335; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.045 с.)
Главная | Случайная страница | Обратная связь