- •Институт математики, экономики и механики кафедра математического обеспечения компьютерных систем в. С. Макогон, и. Н. Лисицына
- •Оглавление
- •Введение
- •Основныетипы данных, операции и выражения
- •Описание переменных.
- •Операции , выражения и операторы.
- •3. Операторы управления программой. Базовые управляющие структуры.
- •Операторы ветвления Условный оператор if
- •Оператор - переключатель
- •Операторы повторения (цикла).
- •4. Программирование алгоритмов линейной структуры.
- •5. Программирование разветвляющихся алгоритмов (оператор if).
- •6. Программирование разветвляющихся алгоритмов (оператор switch)
- •Оператор for
- •Цикл с постусловием do -while
- •8. Итерационные циклы
- •Задачи для самостоятельного решения
- •9. Программирование алгоритмов с использованием функций
- •Основные понятия численного решения уравнений
- •10. Программирование алгоритмов с использованием массивов
- •11. Символьные переменные и строки. Обработка строк.
- •Другие средства ввода-вывода символов и строк
- •Массивы строк
- •12. Указатели
- •Массивы указателей
- •2. Описание метода трапеций
- •3. Программный комплекс
- •13. Структуры
- •Указатели на структуры
- •14. Файлы. Потоковый ввод-вывод
- •Функции для работы с файлами
- •Открытие файловых потоков
- •Закрытие файловых потоков
- •Удаление файлов
- •Переименование файлов
- •Реинициализация
- •Функции для ввода-вывода по символам
- •1 Вариант) содержит только буквы исходной строки
- •2 Вариант) перевернута по отношению к исходной
- •Двоичные (бинарные) файлы. Блочно-ориентированный ввод-вывод.
Реинициализация
Прототип:
void rewind(FILE *_stream);
Описание:
Помещает указатель позиции файла на начало файла и сбрасывает индикаторы ошибок и конца файла. rewind(stream) эквивалентно fseek(stream, 0L, SEEK_SET) (см. далее), за исключением того, что rewind() обнуляет признаки конца файла и ошибки, в то время как fseek() обнуляет только признак конца файла.
Функции для ввода-вывода по символам
Чтение символов из потока
Чтение символов осуществляют функции getc() и fgetc()
Прототипы:
int getc(FILE *_fp);
int fgetc(FILE *_fp);
Описание:
Обе функции (getc() представляет собой макрокоманду), получают следующий по порядку символ из входного потока _fp и увеличивают указатель текущего положения в потоке на 1.
Возвращаемое значение:
При успешном завершении функции getc() и fgetc() возвращают считанный символ после предварительного преобразования его в целое без расширения знака. При возникновении ситуации EOF или при ошибке они возвращают EOF.
Пример 1:
#include<stdio.h>
int main(void)
{
char ch;
printf("Введите символ :");
/* ввести символ из стандартного входного потока stdin */
ch = getc(stdin);
printf("Был введен символ '%c'\n",ch);
return 0;
}
Пример 2:
#include <conio.h>
#include <iostream>
using namespace std;
// Обработка текстового файла, созданного
// обычным текстовым редактором
int main()
{
char namein[15]; char ch; FILE *fp;
system("chcp 1251");
printf("Введите путь и имя вводного файла,например,test1\n");
gets(namein);
if((fp=fopen(namein, "r"))==NULL)
{
perror(" Не могу открыть вводной файл... ");
// perror(namein );
getch();exit(1);
}
do
{
/* ввести символ из файла */
ch = fgetc(fp);
/* вывести символ на экран */
printf("%c",ch);
} while(ch!=EOF);
getch();fclose(fp);
return0;
}
Для ввода символов со стандартного вводного потока (с клавиатуры) используется функцияgetchar().
Прототип:
int getchar(void);
Описание:
getchar() - это макрокоманда, вводящая символ из потока stdin. Она определена следующим образом: getc(stdin).
Возвращаемое значение:
При успешном завершении функция getchar() возвращает считанный символ после предварительного преобразования его в целое без расширения знака. При возникновении ситуации EOF или при ошибке она возвращает EOF.
Пример:
#include<stdio.h>
int main(void)
{
char c;
/* Замечание. getchar читает символы с stdin, который имеет
буфер на одну строку. Поэтому она ничего не возвращает до
тех пор, пока вы не нажмете Enter */
while((c=getchar())!='\n')
printf("%c",c);
return 0;
}
Запись символов в поток
Запись символов осуществляют функции putc() и fputc().
Прототипы:
int putc(int _c, FILE *_fp);
int fputc(int _c, FILE *_fp);
Описание:
Обе функции (функция putc() представляет собой макрокоманду) выводят символ _c в указанный выходной поток _fp.
Возвращаемое значение:
При успешном завершении функции putc() и fputc() возвращают символ _c. При возникновении ошибки обе функции возвращают значение EOF.
Пример:
#include <stdio.h>
int main(void)
{
char msg[] = "Здравствуй мир";
int i=0;
while(msg[i])
{
fputc(msg[i],stdout);
i++;
}
return 0;
}
Для вывода символов в стандартный выводной поток (дисплей) используется функция putchar().
Прототип:
int putchar(int _c);
Описание:
putchar() – это макрокоманда, определенная как putc(_c, stdout);
Возвращаемое значение:
При успешном завершении putchar() возвращает выведенный символ _c. При ошибке она возвращает EOF.
Пример:
#include<stdio.h>
int main(void)
{
char msg[] = "Тестовый пример";
int i=0;
while(msg[i])
{
putchar(msg[i]);
i++;
}
return 0;
}
Задача 163.Программа создает программным путем текстовый файл (посимвольно) на диске, затем переносит из этого файла в другой файл каждый третий (0, 3, 6, …) символ исходного файла. Попутно результат обработки выводится на экран.
#include <conio.h>
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
// программа печатает каждый 3-й символ текстового файла, созданного
// программным путем с возможным добавлением текста (режим а+)
system("chcp 1251");//переключаем консоль в кодировку win1251
char nameout[15]; FILE *out, *in; char ch;
//для русских int ch не обязательно для норм работы EOF !
cout<< "Введите имя cоздаваемого файла,например,D:\\eddy.txt\n";
gets(nameout);
if((out = fopen(nameout, "a+"))==NULL) //для чтения и записи
{ cout<<"Не могу создать файл ...!";//perror(nameout);
getch(); exit(1);
}
cout<< "Введите последовательность символов, в конце – Ctrl+Z\n";
while ((ch=getchar())!=EOF)
fputc (ch, out );
cout<< "\nфайл создан";//getch();
// в случае a+ файл можно не закрывать, а сделать так:
rewind(out); //возврат к началу файла
in=out; //просто переустановим указатель
cout<< "\nВведите имя преобразованного файла "; gets(nameout);
out=fopen(nameout, "w");
if(out==NULL)
{
cout<< "\n Не могу открыть выводной файл... ";
exit(2);
}
// Обработка созданного файла, содержащего фразы:
// Даже Эдди нас опередил с детским хором
// So even Eddy came oven ready
int k=0;
//while((ch=getc(in))!=EOF)
while(!feof(in))
{ ch=fgetc(in);
if(ch=='\n')
{ putc('\n',out);putchar('\n');}
if(k++%3==0)
{ putc(ch, out);putchar(ch);}
}
fclose(in); fclose(out);
cout<< "конец работы";
getch(); return0;
}
Для проверки программы мы ввели следующий текст:
Даже Эдди нас опередил с детским хором
So even Eddy came oven ready
И вот результат:
Дед спел тихо
Send money
Функции для ввода-вывода по строкам
Чтение строки из потока
Чтение по строкам осуществляет функция fgets()
Прототип:
char * fgets(char *_s, int _size, FILE *_fp);
Описание:
fgets() считывает из потока _fp строку символов и помещает ее в _s. Ввод завершается после считывания _size-1 символов или при вводе символа перехода на следующую строку, смотря, что произойдет раньше. fgets() прекращает ввод строки при получении символа перехода на следующую строку. Нулевой байт добавляется в конец строки для индикации ее конца. Символ конца строки не отбрасывается и располагается непосредственно перед нуль-символом.
Возвращаемое значение:
При успешном завершении возвращает указатель на _s, при ошибке или конце файла возвращает указатель NULL.
Для ввода строки со стандартного вводного потока (с клавиатуры) используется функция gets().
Прототип:
char * gets(char *_s);
Описание:
Функция gets() читает строку символов, оканчивающуюся символом перевода строки , в переменную *_s из стандартного входного потока stdin. Данная символьная строка оканчивается символом перехода на новую строку, который при записи в *_s заменяется на нулевое окончание (\0).
В отличие от scanf(), gets() позволяет вводить строки, содержащие символы пробела и табуляции. Все, что было введено до перевода каретки, помещается в _s.
Возвращаемое значение:
При успешном завершении, функция gets() возвращает строку _s; при достижении конца файла (EOF) или ошибке возвращается NULL.
Пример:
#include <stdio.h>
int main(void)
{
char string[133];
printf("Введите строку:");
gets(string);
printf("Cтрока = '%s'\n,string);
}
Запись строки в поток
Запись в поток по строкам осуществляет функция fputs()
Прототип:
int fputs(char *_s, FILE *_fp);
Описание:
Функция fputs() копирует строку _s , ограниченную нулевым байтом, в поток _fp. Она добавляет в конец строки символ перехода на новую строку. Нулевой символ в файл не переносится.
Возвращаемое значение:
При успешном завершении fputs() возвращает последний выведенный символ. В противном случае возвращает EOF.
Пример:
#include<stdio.h>
int main(void)
{
/* вывести строку в поток */
fputs("Тестовый пример",stdout);
return 0;
}
Для вывода строки в стандартный выводной поток (на экран) используется функция puts().
Прототип:
int puts(char *_s);
Описание:
Функция puts() копирует строку символов с нулевым окончанием в стандартный выходной поток stdout, причем добавляет в конец символ перехода на новую строку.
Возвращаемое значение:
При успешном завершении, функция puts() возвращает ненулевое значение. В противном случае возвращается EOF.
Пример:
#include<stdio.h>
int main(void)
{
/* вывести строку в поток */
puts("Тестовый пример");
return 0;
}
Задача 164.Программа создает программным путем (по строкам) текстовый файл на диске. Ввод строк с клавиатуры осуществляет функция fgets(), вывод на диск построчно – функция fputs().
// fget_fput3_rus.cpp : 14.05.2012г
// Ввод строк с клавиатуры(fgets) и создание текстового файла(fputs)
// Использование fgets и fputs для обычного в/ы (stdin / stdout)
#include<conio.h>
#include<stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
const int size=120;
int main()
{
char line[size]; char nameout[15]; FILE *out;
system("chcp 1251");//переключаем консоль в кодировку win1251
// ОБЯЗАТЕЛЬНО ПЕРЕКЛЮЧИТЬ ШРИФТЫ С ТОЧЕЧНЫХ НА Lucida console
// после запуска программы щелчком мыши в левом верхнем углу
cout<< "Введите имя создаваемого файла,например,D:\omar.txt\n";
gets(nameout);
if((out=fopen(nameout, "a+"))==NULL)
{
cout<< " Не могу открыть выводной файл... ";
getch(); exit(1);
}
cout<< "Введите несколько строк текста, потом Ctrl+Z \n";
while(fgets(line,size,stdin) !=NULL && line[0] !='\n')
{
fputs(line,out);
fputs(line, stdout); // puts(line);
}
cout<< "Файл создан";
fclose(out); getch(); return 0;
}
Задача 165. В программе решается следующая задача. На основе файла, созданного предыдущей программой (см.Задачу 164), строится новый файл, в котором каждая строка: