Вход и изход - 2

Chapter 7 - Input and Output
7.6 Error Handling - Stderr and Exit
7.7 Line Input and Output
7.8 Miscellaneous Functions
7.8.1 String Operations
7.8.2 Character Class Testing and Conversion
7.8.3 Ungetc
7.8.4 Command Execution
7.8.5 Storage Management
7.8.6 Mathematical Functions
7.8.7 Random Number generation

Обработка на грешки - stderr и exit

Съобщенията за грешки се извеждат на stderr.

include <stdio.h>
/* cat: concatenate files, version 2 */

int main(int argc, char *argv[])

{
    FILE *fp;
    void filecopy(FILE *, FILE *);
    char *prog = argv[0];         /* program name for errors */
    if (argc == 1 )                 /* no args; copy standard input */
        filecopy(stdin, stdout);

    else
        while (--argc > 0)
            if ((fp = fopen(*++argv, "r")) == NULL) {
                fprintf(stderr, "%s: can't open %s\n",

                           prog, *argv);
                exit(1);
            }
            else {

                filecopy(fp, stdout);
                fclose(fp);

            }
    if (ferror(stdout)) {
        fprintf(stderr, "%s: error writing stdout\n", prog);
        exit(2);
    }

    exit(0);
}


Вход и изход по редове

Четене и писане на един цял ред:
char *fgets(char *line, int maxline, FILE *fp)
int fputs(char *line, FILE *fp)


Пример:
/* getline: read a line, return length */
int getline(char *line, int max)

{
    if (fgets(line, max, stdin) == NULL)
        return 0;

    else
        return strlen(line);
}

Други функции

   Операции с низове
<string.h>
ebook - The C Programming Language Ritchie & kernighan -.doc strcat(s,t) concatenate t to end of s
strncat(s,t,n) concatenate n characters of t to end of s
strcmp(s,t) return negative, zero, or positive for s < t, s == t, s > t
strncmp(s,t,n) same as strcmp but only in first n characters
strcpy(s,t) copy t to s
strncpy(s,t,n) copy at most n characters of t to s
strlen(s) return length of s
strchr(s,c) return pointer to first c in s or NULL if not present
strrchr(s,c) return pointer to last c in s or NULL if not present

   Проверка и преобразуване на знакови класове
<ctype.h>
isalpha(c) non-zero if c is alphabetic, 0 if not
isupper(c) non-zero if c is upper case, 0 if not
islower(c) non-zero if c is lower case, 0 if not
isdigit(c) non-zero if c is digit, 0 if not
isalnum(c) non-zero if isalpha(c) or isdigit(c), 0 if not
isspace(c) non-zero if c is blank, tab, newline, return, formfeed, vertical tab
toupper(c) return c converted to upper case
tolower(c) return c converted to lower case

   Ungetc

Връща един символ в системния буфер.
int ungetc(int c, FILE *fp)

   Изпълнение на команди

system("date");

   Управление на паметта
ebook - The C Programming Language Ritchie & kernighan -
void *malloc(size_t n)
void *calloc(size_t n, size_t size)
  

int *ip, n = 100;
ip = (int *) calloc(n, sizeof(int));
....
free(p);


Математически функции
<math.h>
sin(x) sine of x, x in radians
cos(x) cosine of x, x in radians
atan2(y,x) arctangent of y/x, in radians
exp(x) exponential function ex
log(x) natural (base e) logarithm of x (x>0)
log10(x) common (base 10) logarithm of x (x>0)
pow(x,y) xy
sqrt(x) square root of x (x>0)
fabs(x) absolute value of x

   Генератор на случайни числа
<stdlib.h>
Редица от псевдослучайни цели числа:
rand(), [0, RAND_MAX]

Случайни числа в интервала [0, 1]'
#define frand() ((double) rand() / (RAND_MAX+1.0))

Начална стойност на редицата от случайни числа:
srand(unsigned)

Упражнение:
Да се дефинира структура employee, съхраняваща име на човек, служебен номер и заплата.
Да се дефинира масив от такива структури, да се чете от файл таблица - име (низ), служебен номер (цяло положително число, по-малко от 10000) и заплата (тип float). Да се напишат и тестват функции за:
- Изчисляване на средната заплата.
- Изтриване на ред от таблицата по зададен служебен номер и отпечатване на новата таблица в нов файл.
- Създаване на файл, само с име и заплата.
- Сортиране на редовете на таблицата по име и отпечанване във файл.
- Сортиране на редовете на таблицата по служебен номер и отпечанване във файл.

Реализацията да се направи по един от следните начини:
1. вариант: програма emp1.c - името в структурата е в char name[50]; - таблицата се чете в масив от структури:
struct emp
loyee tab[100];

2. вариант: програма emp2.c - името в структурата е в char *name; - таблицата се чете в масив от структури:
struct employee tab[100];

3. вариант: програма emp3.c - името в структурата е в char *name; - таблицата се чете в масив от указатели към структури:
struct emp
loyee *tab[100];

4. вариант: програма emp4.c - името в структурата е в char name[50]; - таблицата се чете в свързан списък, в дефиницията на структурата се добавя:
struct employee *next;

5. вариант: програма emp5.c - името в структурата е в char *name; - таблицата се чете в свързан списък, в дефиницията на структурата се добавя:
struct employee *next;