C, PHP, VB, .NET

Дневникът на Филип Петров


Категория ‘С/С++’

* Работа с файлове от ниско ниво (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;
	};

Лесно можете да направите аналогия с рекурсивните функции. Използвайки подобни структури можем лесно да създаваме добре познати структури от данни като линейни списъци и бинарни дървета например.

Прочети още...

.