Лекции, страница 9
Описание файла
PDF-файл из архива "Лекции", который расположен в категории "". Всё это находится в предмете "основы конструкторско-технологической информатики (окти)" из 2 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 9 страницы из PDF
Этоспециальные символы, выполняющие роль ограничителей строки, поэтому внутри строкиих надо экранировать (т.е. защищать от интерпретации как специальных символов) спомощью обратной косой черты \, которая, напомним, в системе Unix и в языке Сивыполняет роль защитного символа. Отметим также, что мы воспользовались стандартнойфункцией sqrt, вычисляющей квадратный корень числа, и стандартной функцией strlen,вычисляющей длину строки.Понятие потока ввода или выводаВ операционной системе Unix и в других системах, использующих идеи системы Unix (например,MS DOS и MS Windows), применяется понятие потока ввода или вывода.
Поток представляет собойпоследовательность байтов. Различают потоки ввода и вывода. Программа может читать данные из потокаввода и выводить данные в поток вывода. Программы можно запускать в конвейере, когда поток выводапервой программы является потоком ввода второй программы и т.д. Для запуска двух программ в конвейереиспользуется символ вертикальной черты | между именами программ в командной строке. Например,командная строка:ab | cd | efозначает, что поток вывода программы ab направляется на вход программе cd, а потоквывода программы cd - на вход программе ef.
По умолчанию, потоком ввода дляпрограммы является клавиатура, поток вывода назначен на терминал (или, как говорятпрограммисты, на консоль). Потоки можно переправлять в файл или из файла, используясимволы больше > и меньше <, которые можно представлять как воронки. Например,командная строкаabcd > tmp.resперенаправляет выходной поток программы abcd в файл "tmp.res", т.е.
данные будутвыводиться в файл вместо печати на экране терминала. Соответственно, командная строкаabcd < tmp.datзаставляет программу abcd читать исходные данные из файла "tmp.dat" вместо ввода склавиатуры.В Си работа с потоком не отличается от работы с файлом. Доступ к потокуосуществляется с помощью переменной типа FILE *. В момент начала работы Сипрограммы открыты три потока:•••stdin -- стандартный входной поток. По умолчанию он назначен на клавиатуру;stdout -- стандартный выходной поток. По умолчанию он назначен на экран терминала;stderr -- выходной поток для печати информации об ошибках.
Он также назначен по умолчанию наэкран терминала.Переменные stdin, stdout, stderr являются глобальными, они описаны в стандартномзаголовочном файле "stdio.h. Операции файлового ввода-вывода могут использовать этипотоки, например, строкаfscanf(stdin, "%d", &n);вводит значение целочисленной переменной n из входного потока. Строкаfprintf(stdout, "n = %d\n", n);выводит значение переменой n в выходной поток. Строкаfprintf(stderr, "Ошибка при открытии файла\n");выводит указанный текст в поток stderr, используемый обычно для печати сообщений обошибках.
Функция perror также выводит сообщения об ошибках в поток stderr.По умолчанию, стандартный выходной поток и выходной поток для печати ошибокназначены на экран терминала. Однако операция перенаправления вывода в файл >действует только на стандартный выходной поток. Например, в результате выполнениякомандной строкиabcd > tmp.resобычный вывод программы abcd будет записываться в файл "tmp.res", а сообщения обошибках по-прежнему будут печататься на экране терминала. Для того чтобы30перенаправить в файл "tmp.log" стандартный поток печати ошибок, следует использоватькомандную строкуabcd 2> tmp.log(между двойкой и символом > не должно быть пробелов).
Двойка здесь означает номерперенаправляемого потока. Стандартный входной поток имеет номер 0, стандартныйвыходной поток - номер 1, стандартный поток печати ошибок - номер 2. Данная командаперенаправляет только поток stderr, поток stdout по-прежнему будет выводиться натерминал. Можно перенаправить потоки в разные файлы:abcd 2> tmp.log > tmp.resТаким образом, существование двух разных потоков вывода позволяет принеобходимости направить нормальный вывод и вывод информации об ошибках в разныефайлы.Функции scanf и printf ввода и вывода в стандартные потокиПоскольку ввод из стандартного входного потока, по умолчанию назначенного наклавиатуру, и вывод в стандартный выходной поток, по умолчанию назначенный на экрантерминала, используются особенно часто, библиотека функций ввода-вывода Сипредоставляет для работы с этими потоками функции scanf и printf.
Они отличаются отфункций fscanf и fprintf только тем, что у них отсутствует первый аргумент, означающийпоток ввода или вывода. Строкаscanf(format, ...); // Ввод из станд. входного потокаэквивалентна строкеfscanf(stdin, format, ...); // Ввод из потока stdinАналогично, строкаprintf(format, ...); // Вывод в станд. выходной потокэквивалентна строкеfprintf(stdout, format, ...); // Вывод в поток stdoutФункции текстового преобразования sscanf и sprintfСтандартная библиотека ввода-вывода Си предоставляет также две замечательныефункции sscanf и sprintf ввода и вывода не в файл или поток, а в строку символов (т.е.массив байтов), расположенную в памяти компьютера. Мнемоника названий функцийследующая: в названии функции fscanf первая буква f означает файл (file), т.е.
вводпроизводится из файла; соответственно, в названии функции sscanf первая буква sозначает строку (string), т.е. ввод производится из текстовой строки. (Последняя буква f вназваниях этих функций означает форматный). Первым аргументом функций sscanf иsprintf является строка (т.е.
массив символов, ограниченный нулевым байтом), из которойпроизводится ввод или в которую производится вывод. Эта строка как бы стоит на местефайла в функциях fscanf и fprintf.Фунции sscanf и sprintf удобны для преобразования данных из текстовогопредставления во внутреннее и обратно. Например, в результате выполнения фрагментаchar txt[256] = "-135.76"; double x;sscanf(txt, "%lf", &x);текстовая запись вещественного числа, содержащаяся в строке txt, преобразуется вовнутреннее представление вещественного числа, результат записывается в переменную x.Обратно, при выполнения фрагментаchar txt[256]; int x = 12345;sprintf(txt, "%d", x);значение целочисленной переменной x будет преобразовано в текстовую форму изаписано в строку txt, в результате строка будет содержать текст "12345", ограниченныйнулевым байтом.Для преобразования данных из текстового представления во внутреннее встандартной библиотеке Си имеются также функции atoi и atof с прототипамиint atoi(const char *txt);// текст => intdouble atof(const char *txt); // текст => double31Функция atoi преобразует текстовое представление целого числа типа int во внутреннее.Соответственно, функция atof преобразует текстовое представление вещественного числатипа double.
Мнемоника имен следующая:••atoi означает "character to integer";atof означает "character to float".Прототипы функций atoi и atof описаны в стандартном заголовочном файле "stdlib.h", ане "stdio.h", поэтому при их использовании надо подключать этот файл:#include <stdlib.h>(вообще-то, это можно делать всегда, поскольку "stdlib.h" содержит описания многихполезных функций, например, функции завершения программы exit, генератораслучайных чисел rand и др.).Другие полезные функции ввода-выводаСтандартная библиотека ввода-вывода Си содержит ряд других полезных функцийввода-вывода. Отметим некоторые из них.Посимвольный ввод-выводввести символ из потока fвывести символ в поток fint fgetc(FILE *f);int fputc(int c, FILE *f);Построковый ввод-выводввести строку из потока fвывести строку в поток fchar *fgets(char *line,int size, FILE *f);char *fputs(char *line, FILE *f);Позиционирование в файлеint fseek(FILE *f, long offset, int whence);long ftell(FILE *f);int feof(FILE *f);установить текущую позицию в файле fполучить текущую позицию в файле fпроверить,достигнут ли конец файла fФункция fgetc возвращает код введенного символа или константу EOF(определенную как минус единицу) в случае конца файла или ошибки чтения.Функция fputc записывает один символ в файл.
При ошибке fputc возвращаетконстанту EOF (т.е. отрицательное значение), в случае удачи - код выведенного символа c(неотрицательное значение).В качестве примера использования функции fgetc перепишем рассмотренную ранеепрограмму wc, подсчитывающую число символов и строк в текстовом файле://// Файл "wc1.cpp"// Подсчет числа символов и строк в текстовом файле// с использованием функции чтения символа fgetc//#include <stdio.h> // Описания функций ввода-выводаint main() {char fileName[256];FILE *f;int c;int numChars = 0;int numLines = 0;//////////Путь к файлуСтруктура, описывающая файлКод введенного символаСуммарное число символов := 0Суммарное число строк := 0printf("Введите имя файла: ");scanf("%s", fileName);f = fopen(fileName, "rb"); // Открываем файлif (f == 0) { // При ошибке открытия файла// Напечатать сообщение об ошибкеperror("Не могу открыть файл для чтения");return 1; // закончить работу программы с кодом 132}while ((c = fgetc(f)) != EOF) { // Читаем символ// Цикл продолжается, пока c != -1 (конец файла)++numChars; // Увеличиваем число символов// Подсчитываем число символов перевода строкиif (c == '\n') {++numLines; // Увеличиваем число строк}}fclose(f);// Печатаем результатprintf("Число символов в файле = %d\n", numChars);printf("Число строк в файле = %d\n", numLines);}return 0; // Возвращаем код успешного завершенияПример выполнения программы wc1 в применении к собственному тексту, записанному вфайле "wc1.cpp:Введите имя файла: wc1.cppЧисло символов в файле = 1334Число строк в файле = 44Функция fgets с прототипомchar *fgets(char *line, int size, FILE *f);выделяет из файла или входного потока f очередную строку и записывает ее в массивсимволов line.
Второй аргумент size указывает размер массива для записи строки.Максимальная длина строки на единицу меньше, чем size, поскольку всегда в конецсчитанной строки добавляется нулевой байт. Функция сканирует входной поток до техпор, пока не встретит симол перевода строки "\n" или пока число введенных символов нестанет равным size - 1. Символ перевода строки "\n" также записывается в массивнепосредственно перед терминирующим нулевым байтом. Функция возвращает указательline в случае успеха или нулевой указатель при ошибке или конце файла.Раньше в стандартную библиотеку Си входила также функция gets с прототипомchar *gets(char *line);которая считывала очередную строку из стандартного входного потока и помещала ее вмассив, адрес которого являлся ее единственным аргументом.