Чтение и запись текстовых файлов.
Лекция
Текстовые файлы (продолжение )
Задача 1.
Задан файл (.txt) целых чисел.
Записать его в другой файл , используя функцию eof()
//arb2014_file1
#include<fstream>
#include<iostream>
using namespace std;
void main()
{
ifstream in("arb.txt");
ofstream out("out.txt");
ofstream out1("out1.txt");
int x;
cout<<"file in"<<endl;
if(!in)
{
cout<<"can't open file!"<<endl;
exit(-1);
}
cout<<"file in:"<<endl;
out<<"file in:"<<endl;
out1<<"file in:"<<endl;
while(!in.eof())
{
in>>x;
cout<<"!in.eof()= "<<!in.eof()<<" "<<x<<endl;
out1<<"!in.eof()= "<<!in.eof()<<" "<<x<<endl;
out<<x<<' ';
}
out<<endl; out1<<endl;
out1.close(); out.close(); in.close();
cout<<endl;
}
File in(“arb.txt”)
1 2 3 4 5 6 7 8 9 10 11
File out(“out.txt”)
file in:
1 2 3 4 5 6 7 8 9 10 11
File out1(“out1.txt”)
file in:
!in.eof()= 1 1
!in.eof()= 1 2
!in.eof()= 1 3
!in.eof()= 1 4
!in.eof()= 1 5
!in.eof()= 1 6
!in.eof()= 1 7
!in.eof()= 1 8
!in.eof()= 1 9
!in.eof()= 1 10
!in.eof()= 0 11
Задача 2.
Задан файл (.txt) целых чисел.
Разбить его на два файла , содержащие четные и нечетные числа
//arb2014_file2
#include<fstream>
#include<iostream>
using namespace std;
void main()
{
ifstream in("arb.txt");
ofstream out2("out2.txt");
ofstream out1("out1.txt");
int x;
if(!in)
{
cout<<"can't open file!"<<endl;
exit(-1);
}
out1<<"file odd numbers:"<<endl;
out2<<"file even numbers:"<<endl;
while(!in.eof())
{
in>>x;
if (x%2) out1<<x<<’ ‘;else out2<<x<<’ ‘;
}
out1<<endl; out2<<endl;
out1.close(); out2.close(); in.close();
}
arb.txt
1 2 3 4 5 6 7 8 9 10
out1.txt
file odd numbers:
1 3 5 7 9
out1.txt
file even numbers:
2 4 6 8 10
Задача 3.
Задан файл (.txt) целых чисел.
Разбить его на два файла , содержащие четные и нечетные числа (с помощью функции).
//arb2014_file3
#include<fstream>
#include<iostream>
using namespace std;
void create_file(ifstream &f, ofstream &g1, ofstream &g2)
{
int x;
if(!f)
{
cout<<"can't open file!"<<endl;
exit(-1);
}
g1<<"file odd numbers:"<<endl;
g2<<"file even numbers:"<<endl;
while(!f.eof())
{
f>>x;
if (x%2) g1<<x<<’ ‘;else g2<<x<<’ ‘;
}
g1<<endl; g2<<endl;
}
/////////////////////////////////
void main()
{
ifstream in("arb.txt");
ofstream out2("out2.txt");
ofstream out1("out1.txt");
create_file(in,out1,out2);
out1.close();
out2.close();
in.close();
}
Задача 4.
Задан файл (.txt) целых чисел.
Разбить его на два файла , содержащие четные и нечетные числа и найти max (с помощью функций).
//arb2014_file4
#include<fstream>
#include<iostream>
using namespace std;
////////////////////////////////
void create_file(ifstream &f, ofstream &g1, ofstream &g2)
{
int x;
if(!f)
{
cout<<"can't open file!"<<endl;
exit(-1);
}
while(!f.eof())
{
f>>x;
if (x%2) g1<<x<<’ ‘;else g2<<x<<’ ‘;
}
g1<<endl; g2<<endl;
}
/////////////////////////////////
int max(ifstream &f)
{
int x,m;
if(!f)
{
cout<<"can't open file!"<<endl;
exit(-1);
}
f>>m;
while(!f.eof())
{
f>>x;
if (m<x) m=x;
}
return m;
}
/////////////////////////////////
void main()
{
ifstream in("arb.txt");
ofstream out2("out2.txt");
ofstream out1("out1.txt");
create_file(in,out1,out2);
out1.close();
out2.close();
in.close();
ifstream in1(“out1.txt”); ifstream in2(“out2.txt”);
cout<<”max odd= “<<max(in1)<<endl;
cout<<”max even= “<<max(in2)<<endl;
in1.close();in2.close();
}
}
Пример 1.
#include <iostream.h>
#include <fstream.h>
const int n=10;
void create(ifstream&f, int x[][], int k)
{
int i,j;
for (i=0; i<k; i++)
for (j=0; j<k; j++)
f>>x[i][j];
}
void show(ofstream&f, int x[][], int k)
{
int i,j;
for (i=0; i<k; i++)
{
for (j=0; j<k; j++)
f<<a[i][j]<<’ ’;
f<<endl;
}
}
void mult (int **x, int**y, int**z, int n)
{
int i, j, k;
for (i=0; i<n; i++)
for (j=0; j<n; j++)
{
z[i][j]=0;
for (k=0; k<n; k++)
z[i][j]=z[i][j]+x[i][k]*y[k][j];
}
}
Void main()
{
int a[n][n], b[n][n],c[n][n];
ifstream in1(“in.txt”);
//связь логического имени файла с физическим.
// Открытие файла для чтения
ifstream in2(“in2.txt”);
ofstream out(“out.txt"); //открываем файл для записи
create(in,a,n);
create(in2,b,n);
in1.close();
in2.close();
// закрытие файлов- ОБЯЗАТЕЛЬНО!
mult(a,b,c,n);
show(out, c,n);
out.close();
}
Таблица успеваемости факультета ВМК
Session results on faculty of computer science(VMK)
perfect | good | satisfy | poor | |
first | ||||
second | ||||
third | ||||
fourth | ||||
fifth | ||||
Total: |
Двумерный массив данных
Массив Total
Массив строки
Массив курсов
Массив оценок
Данные во входном файле
Session results on faculty of computer science
Perfect good satisfy poor
2 3 4 5
2 3 3 3
3 3 3 3
4 4 4 4
5 5 5 5
#include<iostream>
#include<iomanip>
#include<fstream>
#include<cstring>
using namespace std;
const int numberCourse=5;
const int numberMark=4;
const int lengthIndent=7;// длина абзаца
const int lengthTable=56;// длина таблицы
const int lengthColumn=10;// длина колонки
/////////////////////////////////////////////////
void star(int n,int m)
{
cout.width(n);
int i;
for (i=0;i<m;i++)
cout<<'*';
cout<<endl;
}
///////////////////////////////////////////////
void star1(int n)
{
int i;
cout.width(n);
cout<<"*";
cout.width(lengthColumn+1);
cout<<"*";
for (i=0;i<numberMark;i++)
{
cout.width(lengthColumn+1);
cout<<'*';
}
cout<<endl;
}
void main()
{
char name_Course[numberCourse][15];
char name_Mark[numberMark][20];
int number_Student[numberCourse][numberMark];
char name_Faculty[80];
int Total[numberMark];
ifstream in("arb.txt");
ofstream out("vmk.txt");
int i,j;
in.getline(name_Faculty,80);
for (i=0;i<numberCourse;i++)
in>>name_Course[i];
for (i=0;i<numberMark;i++)
in>> name_Mark[i];
for (i=0;i<numberCourse;i++)
for (j=0;j<numberMark;j++)
in>> number_Student[i][j];
/*
cout<<name_Faculty<<endl;
for (i=0;i<numberCourse;i++)
cout<<name_Course[i]<<" ";
cout<<endl;
for (i=0;i<numberMark;i++)
cout<< name_Mark[i]<<" ";
cout<<endl;
for (i=0;i<numberCourse;i++)
{
for (j=0;j<numberMark;j++)
cout<<number_Student[i][j]<<" ";
cout<<endl;
}
*/
cout<<endl<<endl;
cout.width( lengthTable + 4 );
cout<<name_Faculty<<endl;
cout<<endl<<endl;
star(lengthIndent+1,lengthTable);//
star1(lengthIndent+1);
cout.width(lengthIndent+1);
cout<<"*";
cout.width(lengthColumn+1);
cout<<"*";
for(i=0;i<numberMark;i++)
{
cout<<" "<<name_Mark[i];
cout.width(lengthColumn-strlen(name_Mark[i]));
cout<<"*";
}
cout<<endl;
star1(lengthIndent+1);
star(lengthIndent+1,lengthTable);
for(i=0;i<numberCourse;i++)
{
star1(lengthIndent+1);
cout.width(lengthIndent+1);
cout<<"*";
cout<<" "<<name_Course[i];
cout.width(lengthColumn-strlen(name_Course[i]));
cout<<"*";
for(j=0;j<numberMark;j++)
{ cout<<setw(6)<<number_Student[i][j];
cout<<setw(5);
cout<<"*";
}
cout<<endl;
star1(lengthIndent+1);
star(lengthIndent+1,lengthTable);
}
for(j=0;j<numberMark;j++)
{
Total[j]=0;
for(i=0;i<numberCourse;i++)
Total[j]+=number_Student[i][j];
}
star(lengthIndent+1,lengthTable);
star1(lengthIndent+1);
cout.width(lengthIndent+1);
cout<<"*"<<" Total *";
for(j=0;j<numberMark;j++)
{ cout<<setw(6)<<Total[j];
cout<<setw(5);
cout<<"*";
}
cout<<endl;
star1(lengthIndent+1);
star(lengthIndent+1,lengthTable);
cout<<endl;
}
Лекция №12
Форматирование
4 функции
Создать массив ( целый и вещественный ) в зависимости от флагов форматирования
#include <iostream.h>
#include <iomanip.h> //манипуляторы
#include <fstream.h>
const int n=10;
void create(ifstream&f, int x[n]);
void create(ifstream&f, double x[n]); // перегрузка функции create
void show(ofstream&f, int x[n], int k);
void show(ofstream&f, double x[n], int k); // перегрузка функции show
Void main()
{
ifstream in1(“in1.txt”);
ifstream in2(“in2.txt”);
ofstream out1(“out1.txt”);
ofstream out2(“out2.txt”);
out1.setf( ios::left); //установить флаг форматирования
out1.setf( ios::show pos) ;
out1.setf( ios::oct);
out1.unset( ios::oct);
out1.setf( ios::right);
out2.setf( ios::saentific);
// saentific-плавающая точка; fixed-фиксированная точка
out2.unset( ios:: saentific);
//установка точности
out2. precision(2);
double b[n];
int a[n];
create (in1,a);
in1.close();
show(out1,a);
out1.close();
create (in2,b,20);
in2.close();
show(out2,b,20);
out2.close();
}
void create(ifstream&f, int x[n])
{int i;
for (i=0;i<n;i++)
f>>x[i];
}
void create(ifstream&f, double x[n])
{int i;
for (i=0;i<n;i++)
f>>x[i];
}
void show(ifstream&f, int x[n], int k)
{int i;
for (i=0; i<n;i+)
{ f. width(k);
f.fill(‘#’);
f<<x[i]<<endl;
}
void show(ifstream&f, double x[n], int k)
{int i;
for (i=0; i<n;i+)
{ f. width(k);
f.fill(‘#’);
f<<x[i]<<endl;
}
Файловый ввод-вывод.
Задача 1
// Поиск минимального элемента в массиве.
// Ввод массива из файла fstream.h
// Вывод на экран iostream.h
#include <iostream.h>
#include <fstream.h>
void main()
{
int i, min, mas[10];
ifstream myin("test.txt"); //Открытие файла для ввода.
for(i=0;i<10;i++)
myin >> mas[i];
min=mas[0];
for(i=1;i<10;i++)
if (mas[i]<min)
min=mas[i];
cout << "min = " << min << '\n';
}
Задача 2
// Приближенное вычисление 1/x
// Последовательности {ак} и {вк} заданы рекуррентно: а0 =1,
// в0=1-х; (0<x<2)
// ак= ак-1(1+вк-1), вк=в2к-1, к=1,2,…
// Вычислить аn для наименьшего n, при котором вn ≤ ∂ (∂>0).
// Ввод значения переменной х с экрана iostream.h
// Вывод всех членов последовательностей a и b,
// а также результата в файл fstream.h
#include <iostream.h>
#include <fstream.h>
const double eps= 0.001;
void main()
{
double a=1, b, x;
ofstream myout("result.txt"); //Открытие файла для вывода.
cout << "Enter x:";
cin >> x;
if (x<=0 || x>=2)
cout << "not decision";
else
{
b=1-x;
do
{
a=a*(1+b);
b=b*b;
myout << "a = " << a << " b = " << b << endl;
}
while(b>eps);
myout << "1/x=" << a << endl;
cout<<Проверка Вычислений "<< 1/x <<endl;;
}
}
Задача 3
// Запись вектора в обратном порядке
// Файловый ввод-вывод fstream.h
#include <fstream.h>
const int SIZE= 9;
void main()
{
int i, k, mas[SIZE];
ifstream myin("test.txt"); //Открытие файла для ввода.
ofstream myout("result.txt"); //Открытие файла для вывода.
for(i=0;i<SIZE;i++)
myin >> mas[i];
for(i=0;i<SIZE/2;i++)
{
k=mas[i];
mas[i]= mas[SIZE-i-1];
mas[SIZE-i-1] = k;
}
for(i=0;i<SIZE;i++)
myout << mas[i] << " ";
cout<<endl;
}
Задача 4
// Транспонирование матрицы.
// Файловый ввод-вывод fstream.h
#include <fstream.h>
void main()
{
int i, j;
const int n = 4;
double b[n][n], x;
ifstream myin("test.txt"); //Открытие файла для ввода.
ofstream myout("result.txt"); //Открытие файла для вывода.
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
myin >> b[i][j];
for (i = 0; i < n - 1; i++)
for (j = i + 1; j < n; j++)
{
x = b[i][j];
b[i][j] = b[j][i];
b[j][i] = x;
}
myout << "Транспонированная матрица :”<<endl;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
myout << b[i][j] << ' ';
myout << endl; // Построчный вывод матрицы.
}
}
Задача 5
/* Дан текст, состоящий из слов, разделенных пробелами.
Выполнить форматирование текста, печатая в каждой строке
не более SIZE символов.
*/
// Чтение производится в буфер (массив) по одному слову.
// Длина каждого слова не должна превышать 29 символов.
// Файловый ввод-вывод fstream.h
#include <fstream.h>
#include <string.h>
const int SIZE =30;
void main()
{
char buf[30];
int n, len=0;
ifstream myin("text.txt");
ofstream myout("result.txt");
myin >> buf;
while( !myin.eof() )
{
n = strlen(buf);
if (len+n <= SIZE)
len=len+n+1;
else
{
len=n+1;
myout << '\n';
}
myout << buf << ' ';
myin >> buf;
}
}
Задача 6
/* В упакованном представлении текста – цифра “К” означает
К-кратное повторение следующей за ним буквы. Например,
текст “3bc3a” интерпретируется как ”bbbcaaa”.
Выполнить распаковку текста, считая, что символы символы- цифры рядом не встречаются.
*/
// Посимвольный ввод входного текста.
// Длина слов не не ограничена.
// Функция get() вводит очередной символ из входного потока
// и возвращает его в качестве своего значения.
// Функция put(f) вводит символ f в выходной поток.
// Файловый ввод-вывод.
#include <fstream.h>
void main()
{
char symb;
int n, i;
ifstream myin("text.txt");
ofstream myout("result.txt");
symb=myin.get();
while( !myin.eof() )
{
if ( symb >='0' && symb <='9')
{
n = symb - '0';
symb=myin.get();
if (!myin.eof() )
for(i=1; i<=n; i++)
myout.put(symb);
}
else
myout.put(symb); // Вывод символа в файл.
symb=myin.get();
}
}
Задача 7
/* Дан текст, состоящий из слов, разделенных пробелами.
В каждой строке текста первое и последнее слово поменять
местами.
*/
#include <fstream.h>
#include <string.h>
void main()
{
const size=81; // Длина строки не более 80 символов.
char buf[size];
int n, i;
int first; // Позиция начала первого слова строки
int count_first; // Кол-во символов первого слова
int last; // Позиция окончания последнего слова
int count_last; // Кол-во символов последнего слова
ifstream myin("text.txt"); // Открытие файла для ввода
ofstream myout("result.txt"); // Открытие файла для вывода
while( !myin.eof() )
{ // Чтение строки в буфер
myin.getline(buf, size, '\n');
n=strlen(buf); // n – кол-во символов в buf (без ‘\0’)
// Вывод начальных пробелов строки
for(i=0; i<=n; i++)
if(buf[i]==' ')
myout.put(buf[i]);
else
break;
if(buf[i]=='\0') // Если пустая строка
{
myout.put('\n');
continue; // Переход к следующей итерации цикла
}
first=i; // Позиция начала первого слова строки
count_first=1;
// Подсчет кол-ва символов в первом слове
for(i=first+1; i<n; i++)
if(buf[i]!=' ' && buf[i]!='\0')
count_first++;
else
break;
// Пропуск пробелов в конце строки
for(i=n-1; i>=0 && buf[i]==' '; i--);
last=i; // Позиция окончания последнего слова строки
count_last=0;
// Подсчет кол-ва символов в последнем слове
for(i=last; i>=0; i--)
if(buf[i]!=' ')
count_last++;
else
break;
// Если в строке только одно слово
if(first+count_first > last-count_last)
myout << buf << '\n'; // Вывод всей строки без изменений
else
{ // Вывод последнего слова
for(i=last-count_last+1; i<=last; i++)
myout.put(buf[i]);
// Вывод “середины” строки
for(i=first+count_first; i<=last-count_last; i++)
myout.put(buf[i]);
// Вывод первого слова
for(i=first; i<first+count_first; i++)
myout.put(buf[i]);
myout << '\n';
}
}
}
Задача 8
// Подсчет количества строк, слов и символов в тексте
#include <fstream.h>
#include <iostream.h>
const int SIZE=512;
void main()
{
int nl=0; // Кол-во строк
int nw=0; // Кол-во слов
int nc=0; // Кол-во символов
int n,i;
char buf[SIZE]; // Размерность физического блока на диске
bool inword=false; // Находимся в слове
ifstream myin("text.txt");
while( !myin.eof() )
{
myin.read(buf, SIZE); // Чтение в буфер
n=myin.gcount();
nc+=n;
for(i=0; i<n; i++)
{
if(buf[i]=='\n')
++nl;
if(buf[i]=='\n' || buf[i]==' ')
inword=false;
else
if (!inword)
{
inword=true;
++nw;
}
}
}
cout<<"Lines= "<<nl<<endl;
cout<<"Words= "<<nw<<endl;
cout<<"Symbols= "<<nc<<'endl;
}
Задача
#include <iostream.h>
#include <iomanip.h>
void main()
{
int a=904;
double b=905.906901;
cout<<setw(10)<<a<<endl;
cout<<setw(10)<<setioflags( ios::right)<<a<<endl;
cout<<setw(10)<< setfil(‘*’)<<a<<endl;
cout<<setw(10)<<setioflags( ios::left)<<b<<endl;
cout<<setw(10)<< setfil(‘*’)<<b<<endl;
}
Лекция