Чтение и запись текстовых файлов.

Лекция

Текстовые файлы (продолжение )

Задача 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;

}

Лекция

Наши рекомендации