Тема Цель :

advertisement
Лабораторная работа №12
Тема: Потоковый ввод-вывод в языке Си.
Цель: Изучение принципов работы с файлами через механизм потокового
ввода-вывода на языке Си, приобретение практических навыков работы с
файлами в Си.
1.
2.
3.
4.
Задания для самостоятельного выполнения.
Методические указания.
Пример выполнения задания.
Рейтинговый контроль.
1. Задания для самостоятельного выполнения
Вариант №1
Написать программу, удаляет из текстового файла предложения, содержащие
максимальное количество знаков пунктуации.
Вариант №2
Написать программу, которая заменяет в текстовом файле порядок следования
предложений на обратный.
Вариант №3
Написать программу, в текстовом файле находит и удаляет все вопросительные
предложения.
Вариант №4
Написать программу, которая считывает текст из файла и выводит его на экран,
заменяя при необходимости первую букву всех предложений на заглавную.
Вариант №5
Написать программу, которая удаляет из текстового файла предложения, в которых
встречаются цифры.
Вариант №6
Написать программу, которая удаляет из текстового файла слова, начинающиеся и
оканчивающиеся на гласные буквы.
Вариант №7
Написать программу, удаляет из текстового файла предложения, состоящие из
заданного количества слов.
Вариант №8
Написать программу, которая переформатирует содержимое текстового файла,
формируя из кждого предложения отдельный абзац с абзацныv отступом 4 символа
и задаваемой с клавиатуры шириной строки n.
Вариант №9
Реализовать в программе функцию замену в текстовом файле заданной строки на
другую строку, также задаваемую с клавиатуры.
Вариант №10
Написать программу, которая в текстовом файле заменяет все комментарии, заданные
в круглых скобках, на одиночный пробел.
Вариант №11
Написать программу, которая в текстовом файле находит самое короткое предложение
и переносит его в конец текста.
Вариант №12
Написать программу, которая в текстовом файле меняет местами два соседних слова.
Вариант №13
Написать программу, которая считывает текст из файла и преобразует его таким
образом, чтобы каждая строка имела размер не более n символов (n и имя файла
задаются с клавиатуры)
Вариант №14
Написать программу, которая разбивает содержимое файла на n равных частей,
каждую сохраняя в отдельный файл. Имя файла и число n вводится.
Вариант №15
Написать программу, которая в текстовом файле находит самое короткое предложение
и удаляет его
Вариант №16
Написать программу, которая форматирует содержимое текстового файла по ширине
самой длинной строки, добавляя пробелы между словами в остальных строках
Вариант №17
Написать программу, которая осуществляет поиск заданной cтроки в текстовом файле
и заменяет в файле каждое вхождение на другую строку.
Вариант №18
Написать программу, которая в текстовом файле меняет местами соседние
предложения.
Вариант №19
Написать программу, которая в текстовом файле удаляет все повествовалтельные
предложения, не сбалансированные по скобкам (когда количество открывающихся не
равно количеству закрывающихся).
Вариант №20
Написать программу, которая в текстовом файле находит и удаляет рядом стоящие
одинаковые слова.
2. Методические указания
Для выполнения данной лабораторной работы необходимо изучить
теоретический материал по теме «Файлы»
Для взаимодействия с устройством ввода/вывода программист должен
создать новый поток и связать его с целевым устройством и осуществлять
операции ввода/вывода работая с потоком.
Поток–некая совокупность байт пересылаемая между некоторым
устройством ввода/вывода и оперативной памятью.
Для создания потока:
FILE*fopen(char*filename,char*node);
Режим открытия потока
Состоит из 2-х частей:
1)Режим доступа
2)Тип потока
 Режим доступа
Используются английские буквы r, w, a.
r–открыть для чтения(файл должен существовать)
w–режим открытия на запись(если файл не существует то создается,
если существует, то обнуляется)
a–открытие потока на дозапись(файл должен существовать)
r+–открытие существующего файла на чтение и запись
w+–открытие файла на чтение и запись(если файл не существует то
создается, если существует, то обнуляется)
Тип потока
t–текст
b–двоичный
Пример:
…
FILE*fp;
if((fp=fopen(“tmp.dat”,”w+”))==NULL)
printf(“Ошибка открытия”);
else
{//работа с файлом
…
fclose(fp);
}
Функции
fcloseall(); –закрывает все потоки.
feof(FILE * stream)–возвращает 0 если достигнут конец строки
fseek–позволяет перемещать курсор
fseek(FILE*stream, int offset, int base);
смещение на offset байт относительно base
SEEK_SET-начало потока
SEEK_END-конец потока
SEEK_CUR-текущее положение
ferror(FILE*stream)–возвращает ненулевое значение если возникла ошибка
при работе с потоком
fputc(char*str, FILE*stream)-вставляет(записывает) в поток строку str.
Данная лабораторная работа предусматривает в качестве контроля отчет в
печатном виде и его защита
Отчет должен включать в себя:
1.
2.
3.
4.
Текст задания
Блок – схему
Программный код с комментариями
Примеры рез-та работы программы.
3. Пример выполнения задания:
На диске имеется текстовый файл с произвольным именем. В файл 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;
}
Начало
Ввод wordLength, fileName
f=fopen(fileName,"r")
a=fopen(“words.txt”,"w+”)
да
конец потока f ?
нет
Считываем строку s из входного
потока
x=0, i=0
нет
s[i]=’ ‘ || s[i]=’,‘ || s[i]=’\n‘
да
i++
Вывод
сообщения
об ошибке
i<strlen(s)
нет
s[i]!=' ' && s[i]!=','
&& s[i]!='\n'
да
x++
нет
s==wordLenth
да
Вывод s[i-x].s[i] в поток a
j=0
s[i]=’ ‘ || s[i]=’,‘ || s[i]=’\n‘
да
i++
x=1
i++
Вывод s на экран
Конец
нет
Дополнительные примеры .
Переформатировать файл таким образом, чтобы длина каждой строки было ровно 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();
}
Записать в файл несколько структур типа "Книга". Удалить из файла все книги, изданные
до указанного года
#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);
}
Download