Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие2013_09_28.doc
Скачиваний:
24
Добавлен:
20.05.2015
Размер:
2.72 Mб
Скачать

Реинициализация

Прототип:

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), строится новый файл, в котором каждая строка: