Вход и изход - 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 employee
tab[100];
2. вариант: програма emp2.c - името
в структурата е в char *name; -
таблицата се чете в масив от структури:
struct employee tab[100];
3. вариант: програма emp3.c - името
в структурата е в char *name; -
таблицата се чете в масив от указатели към структури:
struct employee
*tab[100];
4. вариант: програма emp4.c - името
в структурата е в char name[50]; -
таблицата се чете в свързан списък, в дефиницията на структурата се
добавя:
struct employee *next;
5. вариант: програма emp5.c - името
в структурата е в char *name; -
таблицата се чете в свързан списък, в дефиницията на структурата се
добавя:
struct employee *next;