Категория ‘С/С++’
* Работа с файлове от ниско ниво (UNIX стил)
Публикувано на 26 октомври 2008 в раздел С/С++.
Функциите open, close, creat, unlink, read, write и lseek предоставят небуфериран достъп до данните във файловете. Това означава, че ще е нужно ние сами да се грижим за създаването на съответен буфер. Използват се предимно при UNIX -базирани операционни системи (Linux или BSD например).
1. open: Отваря файл с режим на достъп четене (0), запис (1) или четене+запис:
int fd = open(char *path, int flags, mode_t mode);
Променливата fd се напича дескриптор на файла. Ако отварянето на файла не е възможно, то дескриптора ще получи стойност -1. Входния параметър name е символен низ, който описва пътя до файла в операционната система. Флаговете (flags) са следните:
O_RDONLY - само за четене.
O_WRONLY - само за запис.
O_CREAT - Създава файла ако той не съществува.
O_TRUNC - Изтрива съдържанието на файла.
... Прочети още...
* Списък на функциите от други библиотеки
Публикувано на 26 октомври 2008 в раздел С/С++.
Представяме списък с функциите на други често използвани библиотеки:
1. string.h:
memchr();
memcmp();
memcpy();
memmove();
memset();
strcat();
strncat();
strchr();
strcmp();
strncmp(); Прочети още...
* Библиотека ctype.h
Публикувано на 26 октомври 2008 в раздел С/С++.
Библиотеката ctype.h съдържа следните функции:
isalnum(char c): Проверява дали символа е буква (A-Z или a-z) или цифра (0-9)
isalpha(char c): Проверява дали символа е буква (A-Z или a-z)
iscntrl(char c): Проверява дали символа 0x00-0x1F или 0x7F
isdigit(char c): Проверява дали символа е цифра (0-9)
isgraph(char c): Проверява дали символа е от множеството, което може да се отпечата, без space (0x21-0x7E)
islower(char c): Проверява дали подадения символ е малка буква (a-z)
isprint(char c): Проверява дали символа е от множеството, което може да се отпечата (0x20-0x7E)
ispunct(char c): Проверява дали символа е от множеството, което може да се отпечата, но без space и всички alphanum символи
isspace(char c): Проверява дали символа е space, tab, carriage return, new line, vertical tab или formfeed
isupper(char c): Проверява дали символа е главна буква (A-Z)
isxdigit(char c): Проверява дали символа е шеснайсетично число (0-9, A-F или a-f)
char tolower(char c): Преобразува главна в малка буква
char toupper(char c): Преобразува малка в главна буква
* Работа с файлове от високо ниво
Публикувано на 26 октомври 2008 в раздел С/С++.
Когато създаваме каквато и да е програма обработваща данни обикновено се налага да съхраняваме данните след приключването на програмата. Много често се налага и прочитане на данни от вече съществуващи файлове. В С функциите за достъп до файлове от високо ниво са fopen, fclose, getc, putc, fgetc, fputc, ungetc, fseek, fprintf, sprintf, fscanf, sscanf, remove, fgets и fputs. Всички те се намират в stdio.h.
Преди да започнем описанието на функциите трябва да отбележим, че има два вида достъп до дискови файлове - буфериран и небуфериран. Функциите от високо ниво използват буфериран достъп до файловете. При него се чете или записва символ по символ и програмистът не се занимава със системно зависими особености. Прочети още...
* Данни с изброими стойности
Публикувано на 25 октомври 2008 в раздел С/С++.
Може да създаваме и данни, които приемат стойности от крайно множество на целите числа. Изключително е удобно да ги използваме в ситуации, които се характеризират със съвкупност от възможни варианти. Общият синтаксис е:
enum име_на_типа{списък_на_стойностите}променливи;
Типичен пример за С е липсата на булеви променливи в езика: Прочети още...
* Предефиниране на типове
Публикувано на 25 октомври 2008 в раздел С/С++.
Друга удобна конструкция в езика С е създаването на собствени имена на типовете на променливите. Това се извършва чрез описанието typedef:
typedef <стар тип> <нов тип>;
Името определено с typedef може да се използва за описание на променливи (то е еквивалентно на съществуващ тип). Например:
typedef int NEWNAME; NEWNAME i,j;
Прочети още...
* Разредни полета
Публикувано на 25 октомври 2008 в раздел С/С++.
В езика за програмиране С могат да се дефинират набори от последователни битове. Такива набори се наричат "разредни полета". Те осигуряват връзката между високото ниво на езика и ниското ниво на апаратната част.
Разредните полета се дефинират като елементи на структура по следния начин:
unsigned int <име>:<размер>
Следният пример демонстрира дефинирането на разредни полета: Прочети още...
* Обединения
Публикувано на 25 октомври 2008 в раздел С/С++.
Обединенията са много сходни с описаните вече структури. Всички правила за дефиниране на структури са валидни и за обединенията:
union name{ int i; float f; char c; double d; } x,y; ... union name z;
Обръщението към елементи също е аналогично. Съществената разлика между обединенията и структурите е свързана с паметта, която се резервира при дефиниране на конкретна променлива. Прочети още...
* Проблеми свързани с използването на scanf
Публикувано на 25 октомври 2008 в раздел С/С++.
Както вече се запознахте scanf е удобна функция за четене на различни типове данни от клавиатурата. Всеки, който я е използвал активно обаче се е сблъсквал с един много неприятен проблем - невалидно подадени данни от клавиатурата. Например:
int number; printf("I will check if your numbers are odd or even. Type 0 to exit.\n\n"); do{ printf("type a number"); scanf("%d", &number); if (number != 0){ if (number%2 == 0) printf("Even!\n"); else printf("Odd!\n"); } } while (number != 0);
На пръв поглед програмата върви нормално. Въвеждаме числа от клавиатурата и програмата проверява дали са четни или нечетни. Когато въведем 0 програмата ще спре. Какво ще се случи обаче ако не въведем число, а например буквата 'a'? Прочети още...
* Рекурсивни структури
Публикувано на 24 октомври 2008 в раздел С/С++.
Дефинирането на указател като част от структура е напълно валидна конструкция. Освен това е напълно възможно и дефинирането на указател към структура във структура. По този начин е възможно създаването на т.нар. "рекурсивни структури":
struct rec{ int k; struct rec *nextrec; };
Лесно можете да направите аналогия с рекурсивните функции. Използвайки подобни структури можем лесно да създаваме добре познати структури от данни като линейни списъци и бинарни дървета например.