Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Printf(), сprintf(), puts(), cputs()

Поиск

printf() – экранға формат арқылы сөз тір-кесін шығарады;

сprintf() – экранға printf() сияқты формат арқылы сөз тіркесін шығарады, тек олар-дың түстерін textcolor() және textback-ground() функциялары арқылы өзгертуге мүмкіндік береді;

puts(str) – экранға сөз тіркесін шыға-рып, курсорды бірден келесі жолдың ба­ сына алып барады, мұндағы str – тіркес-тік константа немесе тіркестік айныма-лы. Бұлар stdio.h тақырып файлы бойынша жұмыс істейді.

 

Жоғарыдағы функциялар символдық жиымды нөл-дік байтқа дейін шығарады. printf() функциясы символ тіркесі шығарылған соң, курсорды келесі жолға көшір-мейді, ол үшін арнайы формат (\n) жазылуы тиіс.

Ал puts() функциясы символдар шығарылған соң, авто-матты түрде курсорды келесі жол басына көшіреді.

 

#include <stdio.h>

#include <conio.h>

Main()

{ char str1[]= “abc”;

char str 2 []= “def\nghi\n”;

char str 3 []= “jkl”;

puts(str1);

puts(str 2);

puts(str 3);

}

 

Нәтижесі:

abc

def

ghi

jkl

 

cputs(str) – экранға сөз тіркестерін шығарып, олардың түстерін textcolor() және textbackground() функциялары арқылы өзгертуге мүмкіндік береді, conio.h тақырып файлы бойынша жұмыс істейді.

Сөз тіркестерімен орындалатын басқа операциялар да стандартты функциялар арқылы атқарылады. Ол функциялар жұмыс істеуі үшін string.h тақырыптық файлы қажет.

Жалпы сөз тіркестерін қолдану үшін stdlib.h немесе string.h тақырыптық файлдары қолданылады.

Сөз тіркестерімен жұмыс істейтін басқа функциялар

1) strlen(str) функциясы str сөз тір-кесіндегі символдар санын (соңғы нөлді есепке алмайды), яғни жолдың ұзындығын анықтайды, оның типі int, тақырыптық файлы <string.h>

2) strcat(stroka1,stroka2) функциясы тір-кестерді біріктіру үшін қолданылады. Ол stroka1 және stroka2 тіркестерін бірік-тіріп, нәтижені stroka1 айнымалысына меншіктейді.

 

Мысал. Бірнеше сөз тіркестерінің ұзындығын анықтайтын программа құру керек.

// использование функции strlen(str)

#include <conio.h>

#include <stdio.h>

#include <string.h>

Main ()

{

static char t[]= “ Сведения о наших студентах. ”;

clrscr();

printf(“%d\n”,strlen(t));

printf(“%d\n”,strlen(“Сведения о наших студентах.”));

printf(“%d\n”,strlen(“КазНУ им.аль-Фараби”));

printf(“%d\n”,strlen(“”));

getch();

}

 

Мұның нәтижесі:

27

27

19

0

Келесі мысал:

//strcat(str1, str2) ф-циясын пайдалану

#include <conio.h>

#include <stdio.h>

#include <string.h>

Main ()

{

char str1[50]=“ Изучаем язык Си, ";

char str2[]=“ скоро сдадим экзамен.";

clrscr();

printf("%s\n",strcat(str1,str2));

puts(str1); // экранға шығару

puts(strcat(“ Если будем учиться хорошо, ",str2));

getch();

}

 

Мұның нәтижесі:

Изучаем язык Си, скоро сдадим экзамен.

Изучаем язык Си, скоро сдадим экзамен.

Если будем учиться хорошо, скоро сдадим экзамен.

 

3) strcmp(stroka1,stroka2) функциясы екі сөз тіркесін салыстыру үшін қолданылады. Егер олар бірдей болса, функцияның мәні 0-ге тең болады, әйтпесе ол екі тіркестің айырмасын береді. Егер stroka1<stroka2 болса, нәтиже <0 болады, ал stroka1> stro-ka2 болса, нәтиже>0 болады. Көбінесе екі тіркестің бірдей еместігін анықтау үшін қолданылады.

Мысалы:

 

Main ()

{

printf("%d\n",strcmp("Привет","Привет"));

printf("%d\n",strcmp("Jello","Hello"));

printf ("% d \ n ", strcmp (" Приветствие ", " Приветствую "));

getch();

}

Мұның нәтижесі:

0 2 -59

Алғашқы екі сөз бірдей (0), келесі екі сөздің 1-әрпі әр түрлі, олардың ASCII-кодтарының айырмасы – 2 (J - 74, H - 72), ал 3-жолы - 59 (и – 168, у – 227, олардың кодтарының айырмасы 168-227=-59)

 

//strcmp(str1, str2) функциясын пайдалану

 

#include <conio.h>

#include <stdio.h>

#include <string.h>

#define NAME " Ритчи "

Main ()

{ char f[20];

 puts("Си тілінің авторы кім?");

gets(f);

while(strcmp(f,NAME)!=0)

 {puts("Тағы кім болуы мүмкін?");

gets(f);

}

puts(" Дұрыс!");

getch();

}

 

Нәтижесі:

 

Си тілінің авторы кім?

Керниган

Тағы кім болуы мүмкін?

Ритчи

Дұрыс!

 

4) strcpy(str1, str2) функциясы сөздердің көшірмесін алу үшін қажет, мұндағы str2 айнымалысындағы сөз тіркесі str1 айнымалысына көшіріледі.

 

Мысалы:

 

// strcpy(str1, str2) функциясын қолдану

#include <conio.h>

#include <stdio.h>

#include <string.h>

Main ()

{char str1[21];

strcpy (str 1, " Как дела, друг?");

puts(str1);

 strcpy(str1, " Ура!");

 puts (str 1);

getch ();

}

 

Нәтижесі:

Как дела, друг?

Ура!

 

2-мысал:

//strcpy(str1, str2) функциясын пайдалану

#include <conio.h>

#include <stdio.h>

#include <string.h>

#define stroka " функция копирования "

Main ()

{

 char *ptr=stroka;

 char res[25];

 clrscr();

 puts(ptr);

 puts(res);

 strcpy(res,ptr);

 puts(ptr);

 puts(res);

getch();

}

 

Нәтижесі:

Функция копирования

Функция копирования

Функция копирования

 

5) strstr(str1,str2) функциясы 2-ші көрсетілген жолды 1-ші жолдың ішінен іздейді.

6) strset(str,ch) функциясы берілген тіркестегі барлық символдарды көрсе-тілген тіркеске (ch) ауыстырады.

7) strtod(str1,str2) функциясы беріл-ген тіркесті double типті санға ауыс-тырады.

8) strchr(str,c) функциясы берілген тіркестегі коды көрсетілген символдың позициясын анықтайды.

9) strrev(str) функциясы берілген тір-кестің барлық символдарын керісінше бейнелейді.

10) strpbrk(str1,str2 ) функциясы 2-ші тіркестің кез келген символын 1-ші сөзден іздейді.

Структуры данных в Си. Динамические структуры данных

Си тіліндегі мәліметтер структурасы. Мәліметтердің динамикалық структурасы.

Работа с файлами в Си.

Си тіліндегі файлдармен жұмыс істеу.

Тема: Файловый ввод/вывод

Библиотека iostream поддерживает и файловый ввод/вывод. Все операции, применимые в стандартному вводу и выводу, могут быть также применены к файлам. Чтобы использовать файл для ввода или вывода, мы должны включить еще один заголовочный файл: #include Перед тем как открыть файл для вывода, необходимо объявить объект типа of stream ofstream outfile("name-of-file"); Проверить, удалось ли нам открыть файл, можно следующим образом: if (! outfile) // false, если файл не открыт сегг << "Ошибка открытия файла. " ifstream infile("name-of-file"); Так же открывается файл и для ввода, только он имеет тип ifstream if (! infile) // false, если файл не открыт сегг << "Ошибка открытия файла. " Ниже приводится текст простой программы, которая читает файл с именем in_file и выводит все прочитанные из этого файла слова, разделяя их пробелом, в другой файл, #include #include #include int main() { ifstream infile("in_file"); ofstream outfile("out_file"); if (! infile) { cerr << "Ошибка открытия входного файла. " return -1; } if (! outfile) { cerr << "Ошибка открытия выходного файла. " return -2; } названный out_f ile. string word; while (infile >> word) outfile << word «" "; return 0; } В главе 20 библиотека ввода/вывода будет рассмотрена подробно. А в следующих разделах мы увидим, как можно создавать новые типы данных, используя механизм классов и шаблонов.

Основы файловой системы

Файловая система языка С состоит из нескольких взаимосвязанных функций. Самые распространенные из них показаны в табл. 9.1. Для их работы требуется заголовок <stdio.h>.

Таблица 9.1. Часто используемые функции файловой системы С

Имя Что делает
fopen() Открывает файл
fclose() Закрывает файл
putc() Записывает символ в файл
fputc() To же, что и putc()
getc() Читает символ из файла
fgetc() To же, что и getc()
fgets() Читает строку из файла
fputs() Записывает строку в файл
fseek() Устанавливает указатель текущей позиции на определенный байт файла
ftell() Возвращает текущее значение указателя текущей позиции в файле
fprintf() Для файла то же, что printf() для консоли
fscanf() Для файла то же, что scanf() для консоли
feof() Возвращает значение true (истина), если достигнут конец файла
ferror() Возвращает значение true, если произошла ошибка
rewind() Устанавливает указатель текущей позиции в начало файла
remove() Стирает файл
fflush() Дозапись потока в файл

Заголовок <stdio.h> предоставляет прототипы функций ввода/вывода и определяет следующие три типа: size_t, fpos_t и FILE. size_t и fpos_t представляют собой определенные разновидности такого типа, как целое без знака. А о третьем типе, FILE, рассказывается в следующем разделе.

Кроме того, в <stdio.h> определяется несколько макросов. Из них к материалу этой главы относятся NULL, EOF, FOPEN_MAX, SEEK_SET, SEEK_CUR и SEEK_END. Макрос NULL определяет пустой (null) указатель. Макрос EOF, часто определяемый как -1, является значением, возвращаемым тогда, когда функция ввода пытается выполнить чтение после конца файла.FOPEN_MAX определяет целое значение, равное максимальному числу одновременно открытых файлов. Другие макросы используются вместе с fseek() — функцией, выполняющей операции прямого доступа к файлу.

Указатель файла

Указатель файла — это то, что соединяет в единое целое всю систему ввода/вывода языка С. Указатель файла — это указатель на структуру типа FILE. Он указывает на структуру, содержащую различные сведения о файле, например, его имя, статус и указатель текущей позиции в начало файла. В сущности, указатель файла определяет конкретный файл и используется соответствующим потоком при выполнении функций ввода/вывода. Чтобы выполнять в файлах операции чтения и записи, программы должны использовать указатели соответствующих файлов. Чтобы объявить переменную-указатель файла, используйте такого рода оператор:

FILE *fp;

Открытие файла

Функция fopen() открывает поток и связывает с этим потоком определенный файл. Затем она возвращает указатель этого файла. Чаще всего (а также в оставшейся части этой главы) под файлом подразумевается дисковый файл. Прототип функции fopen() такой:

FILE *fopen(const char * имя_файла, const char * режим);

где имя_файла — это указатель на строку символов, представляющую собой допустимое имя файла, в которое также может входить спецификация пути к этому файлу. Строка, на которую указывает режим, определяет, каким образом файл будет открыт. В табл. 9.2 показано, какие значения строки режим являются допустимыми. Строки, подобные "r+b" могут быть представлены и в виде "rb+".

Таблица 9.2. Допустимые значения режим

Режим Что означает r Открыть текстовый файл для чтения w Создать текстовый файл для записи a Добавить в конец текстового файла rb Открыть двоичный файл для чтения wb Создать двоичный файл для записи ab Добавить в конец двоичного файла r+ Открыть текстовый файл для чтения/записи w+ Создать текстовый файл для чтения/записи a+ Добавить в конец текстового файла или создать текстовый файл для чтения/записи r+b Открыть двоичный файл для чтения/записи w+b Создать двоичный файл для чтения/записи a+b Добавить в конец двоичного файла или создать двоичный файл для чтения/записи

Как уже упоминалось, функция fopen() возвращает указатель файла. Никогда не следует изменять значение этого указателя в программе. Если при открытии файла происходит ошибка, то fopen() возвращает пустой (null) указатель.

В следующем коде функция fopen() используется для открытия файла по имени TEST для записи.

FILE *fp;

fp = fopen("test", "w");

Хотя предыдущий код технически правильный, но его обычно пишут немного по-другому:

FILE *fp;

 

if ((fp = fopen("test","w"))==NULL) {

printf("Ошибка при открытии файла.\n");

exit(1);

}

Этот метод помогает при открытии файла обнаружить любую ошибку, например, защиту от записи или полный диск, причем обнаружить еще до того, как программа попытается в этот файл что-либо записать. Вообще говоря, всегда нужно вначале получить подтверждение, что функция - fopen() выполнилась успешно, и лишь затем выполнять с файлом другие операции.

Хотя название большинства файловых режимов объясняет их смысл, однако не помешает сделать некоторые дополнения. Если попытаться открыть файл только для чтения, а он не существует, то работа fopen() завершится отказом. А если попытаться открыть файл в режиме дозаписи, а сам этот файл не существует, то он просто будет создан. Более того, если файл открыт в режиме дозаписи, то все новые данные, которые записываются в него, будут добавляться в конец файла. Содержимое, которое хранилось в нем до открытия (если только оно было), изменено не будет. Далее, если файл открывают для записи, но выясняется, что он не существует, то он будет создан. А если он существует, то содержимое, которое хранилось в нем до открытия, будет утеряно, причем будет создан новый файл. Разница между режимамиr+ и w+ состоит в том, что если файл не существует, то в режиме открытия r+ он создан не будет, а в режиме w+ все произойдет наоборот: файл будет создан! Более того, если файл уже существует, то открытие его в режиме w+ приведет к утрате его содержимого, а в режиме r+оно останется нетронутым.

Из табл. 9.2 видно, что файл можно открыть либо в одном из текстовых, либо в одном из двоичных режимов. В большинстве реализаций в текстовых режимах каждая комбинация кодов возврата каретки (ASCII 13) и конца строки (ASCII 10) преобразуется при вводе в символ новой строки. При выводе же происходит обратный процесс: символы новой строки преобразуются в комбинацию кодов возврата каретки (ASCII 13) и конца строки (ASCII 10). В двоичных режимах такие преобразования не выполняются.

Максимальное число одновременно открытых файлов определяется FOPEN_MAX. Это значение не меньше 8, но чему оно точно равняется — это должно быть написано в документации по компилятору.

Закрытие файла

Функция fclose() закрывает поток, который был открыт с помощью вызова fopen().Функцияfclose() записывает в файл все данные, которые еще оставались в дисковом буфере, и проводит, так сказать, официальное закрытие файла на уровне операционной системы. Отказ при закрытии потока влечет всевозможные неприятности, включая потерю данных, испорченные файлы и возможные периодические ошибки в программе. Функция fclose() также освобождает блок управления файлом, связанный с этим потоком, давая возможность использовать этот блок снова. Так как количество одновременно открытых файлов ограничено, то, возможно, придется закрывать один файл, прежде чем открывать другой. Прототип функции fclose() такой:

int fclose(FILE * уф);

где уф — указатель файла, возвращенный в результате вызова fopen(). Возвращение нуля означает успешную операцию закрытия. В случае же ошибки возвращается EOF. Чтобы точно узнать, в чем причина этой ошибки, можно использовать стандартную функцию ferror() (о которой вскоре пойдет речь). Обычно отказ при выполнении fclose() происходит только тогда, когда диск был преждевременно удален (стерт) с дисковода или на диске не осталось свободного места.

Запись символа

В системе ввода/вывода языка С определяются две эквивалентные функции, предназначенные для вывода символов: putc() и fputc(). (На самом деле putc() обычно реализуется в виде макроса.) Две идентичные функции имеются просто потому, чтобы сохранять совместимость со старыми версиями С. В этой книге используется putc(), но применение fputc() также вполне возможно.

Функция putc() записывает символы в файл, который с помощью fopen() уже открыт в режиме записи. Прототип этой функции следующий:

int putc(int ch, FILE * уф);

где уф — это указатель файла, возвращенный функцией fopen(), a ch — выводимый символ. Указатель файла сообщает putc(), в какой именно файл следует записывать символ. Хотя ch и определяется как int, однако записывается только младший байт.

Если функция putc() выполнилась успешно, то возвращается записанный символ. В противном же случае возвращается EOF.

Чтение символа

Для ввода символа также имеются две эквивалентные функции: getc() и fgetc(). Обе определяются для сохранения совместимости со старыми версиями С. В этой книге используетсяgetc() (которая обычно реализуется в виде макроса), но если хотите, применяйте fgetc().

Функция getc() записывает символы в файл, который с помощью fopen() уже открыт в режиме для чтения. Прототип этой функции следующий:

int getc(FILE * уф);

где уф — это указатель файла, имеющий тип FILE и возвращенный функцией fopen(). Функцияgetc() возвращает целое значение, но символ находится в младшем байте. Если не произошла ошибка, то старший байт (байты) будет обнулен.

Если достигнут конец файла, то функция getc() возвращает EOF. Поэтому, чтобы прочитать символы до конца текстового файла, можно использовать следующий код;

do {

ch = getc(fp);

} while(ch!=EOF);

Однако getc() возвращает EOF и в случае ошибки. Для определения того, что же на самом деле произошло, можно использовать ferror().



Поделиться:


Познавательные статьи:




Последнее изменение этой страницы: 2021-12-15; просмотров: 57; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.227.140.152 (0.009 с.)