Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 11 лет назад пользователемgun.cs.nstu.ru
1 ДОСТУП К ФАЙЛАМ
2 Доступ к файлам Важным шагом в вопросе ввода-вывода является написание программы, работающей с файлом, который не связан заранее с программой. Одной из программ в UNIX, которая явно демонстрирует потребность в таких операциях, является cat, которая объединяет набор из нескольких именованных файлов в стандартный вывод. Программа cat используется для вывода файлов на терминал и в качестве универсального сборщика ввода для программ, которые не имеют возможности обращаться к файлам по имени. Например, команда Важным шагом в вопросе ввода-вывода является написание программы, работающей с файлом, который не связан заранее с программой. Одной из программ в UNIX, которая явно демонстрирует потребность в таких операциях, является cat, которая объединяет набор из нескольких именованных файлов в стандартный вывод. Программа cat используется для вывода файлов на терминал и в качестве универсального сборщика ввода для программ, которые не имеют возможности обращаться к файлам по имени. Например, команда cat x.c,y.c cat x.c,y.c печатает содержимое файлов x.c и y.c в стандартный вывод. печатает содержимое файлов x.c и y.c в стандартный вывод.
3 Доступ к файлам Прежде чем можно считывать из некоторого файла или записывать в него, этот файл должен быть открыт с помощью функции fopen из стандартной библиотеки. Функция fopen берет внешнее имя (подобное x.c или y.c) и возвращает внутреннее имя, которое должно использоваться при последующих чтениях из файла или записях в него. Прежде чем можно считывать из некоторого файла или записывать в него, этот файл должен быть открыт с помощью функции fopen из стандартной библиотеки. Функция fopen берет внешнее имя (подобное x.c или y.c) и возвращает внутреннее имя, которое должно использоваться при последующих чтениях из файла или записях в него. Это внутреннее имя, называемое "указателем файла", фактически является указателем структуры, которая содержит информацию о файле, такую как место размещения буфера, текущая позиция символа в буфере, происходит ли чтение из файла или запись в него и т.д. Это внутреннее имя, называемое "указателем файла", фактически является указателем структуры, которая содержит информацию о файле, такую как место размещения буфера, текущая позиция символа в буфере, происходит ли чтение из файла или запись в него и т.д.
4 Доступ к файлам Пользователи не обязаны знать эти детали, потому что среди определений для стандартного ввода-вывода, получаемых из файла stdio.h, содержится определение структуры с именем FILE. Единственное необходимое для указателя файла описание демонстрируется примером: Пользователи не обязаны знать эти детали, потому что среди определений для стандартного ввода-вывода, получаемых из файла stdio.h, содержится определение структуры с именем FILE. Единственное необходимое для указателя файла описание демонстрируется примером: FILE *fopen(), *fp; FILE *fopen(), *fp; Здесь говорится, что fp является указателем на FILE и fopen возвращает указатель на FILE. Обратите внимание, что FILE является именем типа, подобным int, а не ярлыку структуры; это реализовано как typedef. Здесь говорится, что fp является указателем на FILE и fopen возвращает указатель на FILE. Обратите внимание, что FILE является именем типа, подобным int, а не ярлыку структуры; это реализовано как typedef.
5 Доступ к файлам Фактическое обращение к функции fopen в программе имеет вид: Фактическое обращение к функции fopen в программе имеет вид: fp=fopen(name,mode); fp=fopen(name,mode); Первым аргументом функции fopen является "имя" файла, которое задается в виде символьной строки. Второй аргумент mode ("режим") также является символьной строкой, которая указывает, как этот файл будет использоваться. Допустимыми режимами являются: чтение ("R"), запись ("W") и добавление ("A"). Первым аргументом функции fopen является "имя" файла, которое задается в виде символьной строки. Второй аргумент mode ("режим") также является символьной строкой, которая указывает, как этот файл будет использоваться. Допустимыми режимами являются: чтение ("R"), запись ("W") и добавление ("A").
6 Доступ к файлам Если вы откроете файл, который еще не существует, для записи или добавления, то такой файл будет создан (если это возможно). Открытие существующего файла на запись приводит к отбрасыванию его старого содержимого. Попытка чтения несуществующего файла является ошибкой. Ошибки могут быть обусловлены и другими причинами (например, попыткой чтения из файла, не имея на то разрешения). При наличии какой-либо ошибки функция возвращает нулевое значение указателя NULL (которое для удобства также определяется в файле stdio.h). Если вы откроете файл, который еще не существует, для записи или добавления, то такой файл будет создан (если это возможно). Открытие существующего файла на запись приводит к отбрасыванию его старого содержимого. Попытка чтения несуществующего файла является ошибкой. Ошибки могут быть обусловлены и другими причинами (например, попыткой чтения из файла, не имея на то разрешения). При наличии какой-либо ошибки функция возвращает нулевое значение указателя NULL (которое для удобства также определяется в файле stdio.h).
7 Доступ к файлам Другой необходимой вещью является способ чтения или записи, если файл уже открыт. Здесь имеется несколько возможностей, из которых getc и putc являются простейшими: функция getc возвращает следующий символ из файла; ей необходим указатель файла, чтобы знать, из какого файла читать. Таким образом, Другой необходимой вещью является способ чтения или записи, если файл уже открыт. Здесь имеется несколько возможностей, из которых getc и putc являются простейшими: функция getc возвращает следующий символ из файла; ей необходим указатель файла, чтобы знать, из какого файла читать. Таким образом, c=getc(fp) c=getc(fp) помещает в c следующий символ из файла, указанного посредством fp, и EOF, если достигнут конец файла. помещает в c следующий символ из файла, указанного посредством fp, и EOF, если достигнут конец файла. Функция putc(c,fp) Функция putc(c,fp) помещает символ c в файл fp и возвращает c. помещает символ c в файл fp и возвращает c.
8 Доступ к файлам При запуске программы автоматически открываются три файла, которые снабжены определенными указателями файлов. Этими файлами являются стандартный ввод, стандартный вывод и стандартный вывод ошибок; соответствующие указатели файлов называются STDIN, STDOUT и STDERR. Обычно все эти указатели связаны с терминалом, но STDIN и STDOUT могут быть перенаправлены на файлы или в поток (PIPE). При запуске программы автоматически открываются три файла, которые снабжены определенными указателями файлов. Этими файлами являются стандартный ввод, стандартный вывод и стандартный вывод ошибок; соответствующие указатели файлов называются STDIN, STDOUT и STDERR. Обычно все эти указатели связаны с терминалом, но STDIN и STDOUT могут быть перенаправлены на файлы или в поток (PIPE). При работе с файлами для форматного ввода и вывода можно использовать функции fscanf и fprintf. При работе с файлами для форматного ввода и вывода можно использовать функции fscanf и fprintf.
9 Доступ к файлам Они идентичны функциям scanf и printf, за исключением того, что первым аргументом является указатель файла, определяющий тот файл, который будет читаться или куда будет вестись запись; управляющая строка будет вторым аргументом. Они идентичны функциям scanf и printf, за исключением того, что первым аргументом является указатель файла, определяющий тот файл, который будет читаться или куда будет вестись запись; управляющая строка будет вторым аргументом. Функция fclose разрывает связь между указателем файла и внешним именем, установленную функцией fopen, и высвобождает указатель файла для другого файла. Большинство операционных систем имеют некоторые ограничения на число одновременно открытых файлов, которыми может распоряжаться программа. Функция fclose разрывает связь между указателем файла и внешним именем, установленную функцией fopen, и высвобождает указатель файла для другого файла. Большинство операционных систем имеют некоторые ограничения на число одновременно открытых файлов, которыми может распоряжаться программа.
10 Доступ к файлам То как мы поступили в cat, освободив не нужные нам более объекты, является хорошей идеей. Имеется и другая причина для применения функции fclose к выходному файлу - она вызывает выдачу информации из буфера, в котором putc собирает вывод. (При нормальном завершении работы программы функция fclose вызывается автоматически для каждого открытого файла). То как мы поступили в cat, освободив не нужные нам более объекты, является хорошей идеей. Имеется и другая причина для применения функции fclose к выходному файлу - она вызывает выдачу информации из буфера, в котором putc собирает вывод. (При нормальном завершении работы программы функция fclose вызывается автоматически для каждого открытого файла).
11 Командная строка аргументов Системные средства, на которые опирается реализация языка "С", позволяют передавать командную строку аргументов или параметров начинающей выполняться программе. Когда функция main вызывается к исполнению, она вызывается с двумя аргументами. Первый аргумент (условно называемый argc) указывает число аргументов в командной строке, с которыми происходит обращение к программе; второй аргумент (argv) является указателем на массив символьных строк, содержащих эти аргументы, по одному в строке. Работа с такими строками - это обычное использование многоуровневых указателей. Системные средства, на которые опирается реализация языка "С", позволяют передавать командную строку аргументов или параметров начинающей выполняться программе. Когда функция main вызывается к исполнению, она вызывается с двумя аргументами. Первый аргумент (условно называемый argc) указывает число аргументов в командной строке, с которыми происходит обращение к программе; второй аргумент (argv) является указателем на массив символьных строк, содержащих эти аргументы, по одному в строке. Работа с такими строками - это обычное использование многоуровневых указателей.
12 Командная строка аргументов Самую простую иллюстрацию этой возможности и необходимых при этом описаний дает программа echo, которая просто печатает в одну строку аргументы командной строки, разделяя их пробелами. Таким образом, если дана команда Самую простую иллюстрацию этой возможности и необходимых при этом описаний дает программа echo, которая просто печатает в одну строку аргументы командной строки, разделяя их пробелами. Таким образом, если дана команда echo hello, world echo hello, world то выходом будет то выходом будет hello, world hello, world по соглашению argv[0] является именем, по которому вызывается программа, так что argc по меньшей мере равен 1. по соглашению argv[0] является именем, по которому вызывается программа, так что argc по меньшей мере равен 1.
13 Командная строка аргументов В приведенном выше примере argc равен 3, а argv[0], argv[1] и argv[2] равны соответственно "echo", "hello," и "world". В приведенном выше примере argc равен 3, а argv[0], argv[1] и argv[2] равны соответственно "echo", "hello," и "world". Первым фактическим аргументом является argv[1], а последним - argv[argc-1]. Если argc равен 1, то за именем программы не следует никакой командной строки аргументов. Все это показано в echo: Первым фактическим аргументом является argv[1], а последним - argv[argc-1]. Если argc равен 1, то за именем программы не следует никакой командной строки аргументов. Все это показано в echo: main(argc, argv) /* echo arguments; */ main(argc, argv) /* echo arguments; */ int argc; char *argv[]; int argc; char *argv[]; { int i; { int i; for (i = 1; i < argc; i++) for (i = 1; i < argc; i++) printf("%s%c", argv[i], (argc > 1) ? ' ' : '\n'); printf("%s%c", argv[i], (argc > 1) ? ' ' : '\n'); //printf("%s%c",*++argv,(argc>1)?' ': '\n'); //printf("%s%c",*++argv,(argc>1)?' ': '\n'); } 1) ? ' ' : '\n'); printf("%s%c", argv[i], (argc > 1) ? ' ' : '\n'); //printf("%s%c",*++argv,(argc>1)?' ': '\n'); //printf("%s%c",*++argv,(argc>1)?' ': '\n'); }">
14 Командная строка аргументов Закомментированная строка иллюстрирует, что так как argv является указателем на начало массива строк-аргументов, то, увеличив его на 1 (++argv), мы вынуждаем его указывать на подлинный аргумент argv[1], а не на argv[0]. Каждое последующее увеличение передвигает его на следующий аргумент; при этом *argv становится указателем на этот аргумент. Закомментированная строка иллюстрирует, что так как argv является указателем на начало массива строк-аргументов, то, увеличив его на 1 (++argv), мы вынуждаем его указывать на подлинный аргумент argv[1], а не на argv[0]. Каждое последующее увеличение передвигает его на следующий аргумент; при этом *argv становится указателем на этот аргумент. Теперь можно написать программу cat для конкатенации файлов. Теперь можно написать программу cat для конкатенации файлов. Используемая здесь основная схема оказывается удобной во многих программах: если имеются аргументы в командной строке, то они обрабатываются последовательно. Используемая здесь основная схема оказывается удобной во многих программах: если имеются аргументы в командной строке, то они обрабатываются последовательно.
15 Командная строка аргументов Если такие аргументы отсутствуют, то обрабатывается стандартный ввод. Если такие аргументы отсутствуют, то обрабатывается стандартный ввод. main(argc, argv) /*cat: concatenate files*/ main(argc, argv) /*cat: concatenate files*/ int argc; char *argv[]; int argc; char *argv[]; { { file *fp, *fopen(); int c; file *fp, *fopen(); int c; if(argc==1)/*no args;copy standard input*/ if(argc==1)/*no args;copy standard input*/ filecopy(stdin); filecopy(stdin); else else while (--argc > 0) while (--argc > 0)
16 Командная строка аргументов if ((fp=fopen(*++argv,"r"))==null) { if ((fp=fopen(*++argv,"r"))==null) { printf("cat:can't open %\n",*argv); printf("cat:can't open %\n",*argv); break; } break; } else { else { filecopy(fp); filecopy(fp); fclose(fp);} fclose(fp);} } filecopy(fp)/*copy file fp to STDOUT */ filecopy(fp)/*copy file fp to STDOUT */ file *fp; file *fp; { { while ((c=getc(fp)) !=eof) putc(c, stdout); while ((c=getc(fp)) !=eof) putc(c, stdout); } }
17 Командная строка аргументов Указатели файлов STDIN и STDOUT заранее определены в библиотеке ввода-вывода как стандартный ввод и стандартный вывод; они могут быть использованы в любом месте, где можно использовать объект типа FILE*. Они однако являются константами, а не переменными, так что не пытайтесь им что-либо присваивать. Указатели файлов STDIN и STDOUT заранее определены в библиотеке ввода-вывода как стандартный ввод и стандартный вывод; они могут быть использованы в любом месте, где можно использовать объект типа FILE*. Они однако являются константами, а не переменными, так что не пытайтесь им что-либо присваивать.
18 Обработка ошибок - STDERR и EXIT Обработка ошибок в cat неидеальна. Неудобство заключается в том, что если один из файлов по некоторой причине оказывается недоступным, диагностическое сообщение об этом печатается в конце объединенного вывода. Это приемлемо, если вывод поступает на терминал, но не годится, если вывод поступает в некоторый файл или через поточный (PIPELINE) механизм в другую программу. Обработка ошибок в cat неидеальна. Неудобство заключается в том, что если один из файлов по некоторой причине оказывается недоступным, диагностическое сообщение об этом печатается в конце объединенного вывода. Это приемлемо, если вывод поступает на терминал, но не годится, если вывод поступает в некоторый файл или через поточный (PIPELINE) механизм в другую программу. Чтобы лучше обрабатывать такую ситуацию, к программе точно таким же образом, как STDIN и STDOUT, присоединяется второй выходной файл, называемый STDERR. Чтобы лучше обрабатывать такую ситуацию, к программе точно таким же образом, как STDIN и STDOUT, присоединяется второй выходной файл, называемый STDERR.
19 Обработка ошибок - STDERR и EXIT Если это вообще возможно, вывод, записанный в файле STDERR, появляется на терминале пользователя, даже если стандартный вывод направляется в другое место. Если это вообще возможно, вывод, записанный в файле STDERR, появляется на терминале пользователя, даже если стандартный вывод направляется в другое место. Переделаем программу cat таким образом, чтобы сообщения об ошибках писались в стандартный файл ошибок. Переделаем программу cat таким образом, чтобы сообщения об ошибках писались в стандартный файл ошибок. main(argc,argv) /*cat: concatenate files*/ main(argc,argv) /*cat: concatenate files*/ int argc; char *argv[]; int argc; char *argv[]; { { file *fp, *fopen(); file *fp, *fopen(); if(argc==1)/*no args;copy standard input*/ if(argc==1)/*no args;copy standard input*/ filecopy(stdin); filecopy(stdin);
20 Обработка ошибок - STDERR и EXIT else else while (--argc > 0) while (--argc > 0) if((fp=fopen(*++argv,"r#))==null) { if((fp=fopen(*++argv,"r#))==null) { fprintf(stderr, fprintf(stderr, "cat: can't open,%s\n", argv); "cat: can't open,%s\n", argv); exit(1); exit(1); } else { } else { filecopy(fp); filecopy(fp); } } exit(0); exit(0); } }
21 Обработка ошибок - STDERR и EXIT Программа сообщает об ошибках двумя способами. Диагностическое сообщение, выдаваемое функцией fprintf, поступает в STDERR и, таким образом, оказывается на терминале пользователя, а не исчезает в потоке (PIPELINE) или в выходном файле. Программа сообщает об ошибках двумя способами. Диагностическое сообщение, выдаваемое функцией fprintf, поступает в STDERR и, таким образом, оказывается на терминале пользователя, а не исчезает в потоке (PIPELINE) или в выходном файле. Программа также использует функцию exit из стандартной библиотеки, обращение к которой вызывает завершение выполнения программы. Аргумент функции exit доступен любой программе, так что успешное или неудачное завершение данной программы может быть проверено другой программой, использующей эту в качестве подзадачи. Программа также использует функцию exit из стандартной библиотеки, обращение к которой вызывает завершение выполнения программы. Аргумент функции exit доступен любой программе, так что успешное или неудачное завершение данной программы может быть проверено другой программой, использующей эту в качестве подзадачи.
22 Обработка ошибок - STDERR и EXIT По соглашению величина 0 в качестве возвращаемого значения свидетельствует о том, что все в порядке, а различные ненулевые значения являются признаками нормальных ситуаций. По соглашению величина 0 в качестве возвращаемого значения свидетельствует о том, что все в порядке, а различные ненулевые значения являются признаками нормальных ситуаций. Функция exit вызывает функцию fclose для каждого открытого выходного файла, с тем, чтобы вывести всю помещенную в буферы выходную информацию, а затем вызывает функцию _exit. Функция exit вызывает функцию fclose для каждого открытого выходного файла, с тем, чтобы вывести всю помещенную в буферы выходную информацию, а затем вызывает функцию _exit. Функция _exit приводит к немедленному завершению без очистки каких-либо буферов; конечно, при желании к этой функции можно обратиться непосредственно. Функция _exit приводит к немедленному завершению без очистки каких-либо буферов; конечно, при желании к этой функции можно обратиться непосредственно.
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.