Контрольные вопросы
Что такое поток? Какие преимущества дает потоковый подход к вводу-выводу информации по внешние устройства?
Какие стандартные потоки вам известны? С какими устройствами они связаны по умолчанию?
Как создать собственный поток в программе? Какие режимы доступа к потокам вам известны?
Как осуществляется символьный ввод-вывод в библиотеке stdio?
Что такое текущий указатель потока? Какую роль он играет? Как узнать/изменить позицию указателя?
Для чего предназначен макрос feof? Приведите пример его использования..
Каким образом можно идентифицировать ошибки при работе с потоком?
Проведите сравнительный анализ возможностей вывода массива структур с использованием функций fwrite и fprintf.
Какие средства ввода-вывода предоставляет программисту язык Си++?
Порядок выполнения работы
Ознакомьтесь с теоретическими основами потокового ввода-вывода на языке Си в настоящих указаниях и конспектах лекций.
Получите вариант задания у преподавателя.
Составьте алгоритм решения задачи согласно варианту задания, оформите его в графической форме.
Используя разработанный алгоритм, напишите программу.
Отладьте разработанную программу и покажите результаты работы программы преподавателю.
Составьте отчет по лабораторной работе.
Отчитайте работу преподавателю.
Содержание отчета
Отчет по лабораторной работе должен содержать следующие сведения:
название и цель работы;
вариант задания;
графическую схему алгоритма решения задачи;
листинг разработанной программы с комментариями;
- результаты работы программы.
Задание к лабораторной работе №3
Для задачи из лабораторной работы №1 или №2, полученной ранее, реализовать возможность сохранения введенных пользователем данных (содержимого массива структур или списка структур) в файл на диске. Результаты обработки данных также сохранять в файле. При запуске программы предоставлять пользователю выбор – будет он вводить новые данные, или считает данные из файла (название файла должно вводиться пользователем).
Пример выполнения задания к лабораторной работе №4:
Записать в файл несколько структур типа "Книга". Удалить из файла все книги, изданные до указанного года.
#include <stdio.h>
#include <conio.h>
#include <windows.h>
struct book
{
char title[20],author[10];
int year,pages;
};
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
char filename[30], ch;
int i=0,n, delYear;
FILE *fp,*temp;
book b,tempb;
printf("Получить данные из файла (1) или с клавиатуры (2)? ");
do
{ch=getche();
}
while(ch!='1' && ch!='2');
temp=fopen("temp","w");
int x=sizeof(book);
if(ch=='2')
{
printf("\nСколько книг?");
scanf("%d",&n);
printf("Название файла для сохранения списка книг?");
scanf("%s",&filename);
fp=fopen(filename,"w+");
if(fp==NULL)
{ printf("Не могу открыть указанный файл");
getch();
return 1;
}
for(i=0;i<n;i++)
{
printf("Введите информацию о книге № %d (название, автор, год издания, кол-во страниц)",i+1);
scanf("%s %s %d %d",b.title,b.author,&b.year,&b.pages);
fwrite(&b,x,1,fp);
}
}
if(ch=='1')
{
printf("\nВ каком файле сохранен список книг? ");
scanf("%s",&filename);
fp=fopen(filename,"r+");
if(fp==NULL)
{ printf("Не могу открыть указанный файл");
getch();
return 1;
}
}
printf("\nКниги до какого года издания удалять? ");
scanf("%d", &delYear);
printf("\nВ файле остаются книги:\n");
fseek(fp,0,SEEK_SET);
i=1;
while(1)
{
fread(&b,sizeof(book),1,fp);
if (feof(fp)) break;
if(b.year>delYear)
{ printf("%d) Название: %15s, автор: %10s, год издания: %4d\n", i, b.title, b.author, b.year);
fwrite(&b,sizeof(book),1,temp);
i++;
}
}
getch();
fclose(fp);
fclose(temp);
remove(filename);
rename("temp",filename);
}
Варианты заданий к лабораторной работе №4.
Вариант №1
Написать программу, удаляет из текстового файла предложения, содержащие максимальное количество знаков пунктуации.
Вариант №2
Написать программу, которая заменяет в текстовом файле порядок следования предложений на обратный.
Вариант №3
Написать программу, в текстовом файле находит и удаляет все вопросительные предложения.
Вариант №4
Написать программу, которая считывает текст из файла и выводит его на экран, заменяя при необходимости первую букву всех предложений на заглавную.
Вариант №5
Написать программу, которая удаляет из текстового файла предложения, в которых встречаются цифры.
Вариант №6
Написать программу, которая удаляет из текстового файла слова, начинающиеся и оканчивающиеся на гласные буквы.
Вариант №7
Написать программу, удаляет из текстового файла предложения, состоящие из заданного количества слов.
Вариант №8
Написать программу, которая переформатирует содержимое текстового файла, формируя из каждого предложения отдельный абзац с абзацным отступом 4 символа и задаваемой с клавиатуры шириной строки n.
Вариант №9
Реализовать в программе функцию замену в текстовом файле заданной строки на другую строку, также задаваемую с клавиатуры.
Вариант №10
Написать программу, которая в текстовом файле заменяет все комментарии, заданные в круглых скобках, на одиночный пробел.
Вариант №11
Написать программу, которая в текстовом файле находит самое короткое предложение и переносит его в конец текста.
Вариант №12
Написать программу, которая в текстовом файле меняет местами два соседних слова.
Вариант №13
Написать программу, которая считывает текст из файла и преобразует его таким образом, чтобы каждая строка имела размер не более n символов (nи имя файла задаются с клавиатуры)
Вариант №14
Написать программу, которая разбивает содержимое файла на nравных частей, каждую сохраняя в отдельный файл. Имя файла и число n вводится.
Вариант №15
Написать программу, которая в текстовом файле находит самое короткое предложение и удаляет его
Вариант №16
Написать программу, которая форматирует содержимое текстового файла по ширине самой длинной строки, добавляя пробелы между словами в остальных строках
Вариант №17
Написать программу, которая осуществляет поиск заданной подстроки в текстовом файле и заменяет в файле каждое вхождение на другую подстроку.
Вариант №18
Написать программу, которая в текстовом файле меняет местами соседние предложения.
Вариант №19
Написать программу, которая в текстовом файле удаляет все повествовалтельные предложения, не сбалансированные по скобкам (когда количество открывающихся не равно количеству закрывающихся).
Вариант №20
Написать программу, которая в текстовом файле находит и удаляет рядом стоящие одинаковые слова.
Пример выполнения задания к лабораторной работе №4:
На диске имеется текстовый файл с произвольным именем. В файл words.txtвывести все слова из заданного количества букв (количество букв в слове вводится), каждое в отдельной строке.
Текст программы:
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<windows.h>
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int wordLength,x=0,i,j=0;
char fileName[20];
printf("Ведите длину слова");
scanf("%d",&wordLength);
printf("Ведите название файла");
scanf("%s",fileName);
FILE *A,*f;
//открываем исходный поток
if (f=fopen(fileName,"r"))
{ char s[100];
A=fopen("d:\\words.txt","w+");
//пока не считаем все строки из потока
while(!feof(f))
{
//считывем строку из потока
fgets(s,100,f);
x=0; //количество символов в очередном слове
i=0;
//пропускаем пробелы и знаки препинания в начале строки
while(s[i]==' '||s[i]==','||s[i]=='\n') i++;
for (;i<=strlen(s);i++)
{
//если очередной символ строки – не пробел, запятая, конец строки – //увеличиваем количество символов в слове
if (s[i]!=' ' && s[i]!=',' && s[i]!='\n') x++;
else
{
//нашли символ, заканчмвающий очередное слово
if (x==wordLength) //если символов в слове насчитали wordLength
{
//записываем все символы слова в файл words.txt
for(j=i-x;j<i;j++)
fprintf(A,"%c",s[j]);
fprintf(A,"\n");j=0;
}
//пропускаем дублирующиеся пробелы и запятые после очередного слова
while(s[i]==' '||s[i]==',' || s[i]=='\n') i++;
x=1;
}
}
//выводим строку на экран
puts(s);
}
}
else puts("Ошибка открытия файла");
getch(); return 0;
}
Дополнительный пример .
Переформатировать файл таким образом, чтобы длина каждой строки было ровно n символов (n вводится)
#include <stdio.h>
#include <conio.h>
#include <iostream>
using namespace std;
int main()
{
char filename[30],c;
int i=0,n;
FILE *fp,*temp;
cout<<"Enter file name";
cin>>filename;
cout<<"Maximium length of line";
cin>>n;
fp=fopen(filename,"r");
if(fp==NULL)
{
cout<<"Bad file name";
return 1;
}
temp=fopen("temp","w");
while(!feof(fp))
{
c=fgetc(fp);
if (c!='\n')
{
i++;
if (i>n)
{fputc('\n',temp);
i=0;
}
fputc(c,temp);
}
}
fclose(fp);
fclose(temp);
remove(filename);
rename("temp",filename);
getch();
}
Литература