-->

Основы программирования в Linux

На нашем литературном портале можно бесплатно читать книгу Основы программирования в Linux, Мэтью Нейл-- . Жанр: Программирование / ОС и Сети. Онлайн библиотека дает возможность прочитать весь текст и даже без регистрации и СМС подтверждения на нашем литературном портале bazaknig.info.
Основы программирования в Linux
Название: Основы программирования в Linux
Дата добавления: 16 январь 2020
Количество просмотров: 669
Читать онлайн

Основы программирования в Linux читать книгу онлайн

Основы программирования в Linux - читать бесплатно онлайн , автор Мэтью Нейл
В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стан­дартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым. Для начинающих Linux-программистов

Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала

1 ... 51 52 53 54 55 56 57 58 59 ... 324 ВПЕРЕД
Перейти на страницу:

Функции семейства

scanf
возвращают количество успешно считанных элементов. Оно может быть нулевым, если сбой возник при чтении первого элемента. Если достигнут конец ввода прежде, чем найдено соответствие первому элементу, возвращается
EOF
. Если в файловом потоке возникает ошибка чтения, устанавливается флаг ошибки потока и тип ошибки задается в переменной
errno
. Более подробную информацию см. в разд. "Ошибки потока" далее в этой главе.

Функция

scanf
и другие члены семейства, как правило, не высоко ценятся в основном по трем причинам:

□ традиционно их реализации полны ошибок;

□ в использовании эти функции не гибки;

они могут привести к созданию программного кода, в котором трудно решить, что подвергать синтаксическому анализу.

В качестве альтернативы попытайтесь применять другие функции, такие как

fread
или
fgets
, для чтения строк ввода, а затем воспользуйтесь строковыми функциями для разделения введенной строки на нужные элементы.

Другие потоковые функции

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

stdin
,
stdout
,
stderr
:

fgetpos
— возвращает текущую позицию в файловом протоке;

fsetpos
— устанавливает текущую позицию в файловом потоке;

ftell
— возвращает величину текущего смещения файла в потоке;

rewind
— сбрасывает текущую позицию файла в потоке и переводит ее в начало файла;

freopen
— повторно использует файловый поток;

setvbuf
— задает схему буферизации для потока;

remove
— эквивалент функции
unlink
, до тех пор пока параметр
path
не является каталогом, в этом случае она эквивалентна функции
rmdir
.

Эти библиотечные функции описаны на страницах интерактивного справочного руководства в разделе 3.

Вы можете использовать функции обработки файловых потоков для повторной реализации с их помощью программы копирования файлов. Взгляните на программу copy_stdio.c в упражнении 3.3.

Упражнение 3.3. Третья версия программы копирования файлов

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

#include <stdio.h>

#include <stdlib.h>

int main() {

 int c; 

 FILE *in, *out;

 in = fopen("file.in", "r");

 out = fopen("file.out", "w");

 while((c = fgetc(in)) != EOF) fputc(c, out);

 exit(0);

}

Выполнив эту программу, как прежде, вы получите:

$ <b>TIMEFORMAT=&quot;&quot; time ./copy_stdio</b>

0.06user 0.02system 0:00.11elapsed 81%CPU

Как это работает

На этот раз программа выполняется 0,11 с, не так быстро, как низкоуровневая блочная версия, но значительно быстрее другой посимвольной версии. Это произошло потому, что библиотека stdio поддерживает внутренний буфер в структуре

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

Ошибки потока

Для обозначения ошибок многие функции библиотеки stdio применяют значения за пределами допустимых, например, пустые указатели или константу

EOF
. В этих случаях ошибка указывается во внешней переменной
errno
.

<b>#include &lt;errno.h&gt;</b>

<b>extern int errno;</b>

Примечание

Имейте в виду, что многие функции могут изменять значение

errno
. Оно достоверно, только когда функция закончилась неудачно. Вам следует проверять это значение сразу же, как функция сообщила о сбое. Прежде чем использовать его, скопируйте это значение в другую переменную, поскольку функции вывода, такие как
fprintf
, могут сами изменять
errno
.

Вы можете также запросить состояние файлового потока, чтобы выяснить, возникла ли ошибка или достигнут конец файла.

<b>#include &lt;stdio.h&gt;</b>

<b>int ferror(FILE *stream);</b>

<b>int feof(FILE *stream);</b>

<b>void clearerr(FILE *stream);</b>

Функция

ferror
проверяет индикатор ошибок потока и возвращает ненулевое значение, если индикатор установлен, и ноль в противном случае.

Функция

feof
проверяет индикатор конца файла в потоке и возвращает ненулевое значение, если индикатор установлен, или ноль в противном случае. Применяйте ее следующим образом:

if (feof(some_stream))

 /* Мы в конце */

Функция

clearerr
очищает индикаторы конца файла и ошибки для потока, на который указывает параметр
stream
. Она не возвращает никакого значения, и для нее не определены никакие ошибки. Вы можете применять эту функцию для сброса состояния ошибки в потоках. Примером может быть возобновление записи в поток после разрешения проблемы, связанной с ошибкой "disk full" (диск заполнен).

Потоки и дескрипторы файлов

Каждый файловый поток ассоциирован с низкоуровневым дескриптором файла. Вы можете смешивать операции низкоуровневого ввода/вывода с высокоуровневыми потоковыми операциями, но это, как правило, неразумно, потому что трудно предсказать эффект от применения буферизации.

<b>#include &lt;stdio.h&gt;</b>

<b>int fileno(FILE *stream);</b>

<b>FILE *fdopen(int fildes, const char *mode);</b>

Вы можете определить, какой низкоуровневый дескриптор файла применяется для файлового потока, вызвав функцию

fileno
. Она возвращает дескриптор файла для заданного потока или -1 в случае сбоя. Эта функция полезна при необходимости низкоуровневого доступа к открытому потоку, например для вызова функции
fstat
применительно к этому потоку.

1 ... 51 52 53 54 55 56 57 58 59 ... 324 ВПЕРЕД
Перейти на страницу:
Комментариев (0)
название