Печатать книгуПечатать книгу

§ 10. Тэкставыя файлы

Сайт: Профильное обучение
Курс: Інфарматыка. 10 клас (Павышаны ўзровень)
Книга: § 10. Тэкставыя файлы
Напечатано:: Гость
Дата: Воскресенье, 5 Май 2024, 11:22

10.1. Каманды для работы з тэкставымі файламі

У цяперашні час камп’ютары апрацоўваюць вялізныя масівы вялікіх даных, увод такіх даных з клавіятуры запатрабаваў бы нашмат больш часу, чым іх апрацоўка. Таму ў сучасных мовах праграміравання прадугледжана магчымасць чытаць даныя з файла і запісваць вынікі ў файл. Адзін з самых простых фарматаў файлаў — гэта тэкставыя файлы, якія захоўваюць толькі сімвалы з кодавай табліцы. Ствараць і праглядаць такія файлы можна з дапамогай праграмы Блокнот.

Пры рабоце з тэкставымі файламі змяняецца толькі фармат уводу і вываду даных. Алгарытмічны складальнік працэсу рашэння задачы не змяняецца. Звычайна з дапамогай праграмы Блокнот ствараецца файл, які змяшчае ўваходныя даныя — тыя, якія карыстальнік мог увесці з клавіятуры. Пасля завяршэння работы праграма выводзіць вынік не ў кансоль, а ў файл, які можна адкрыць у Блокноте. Захоўваюцца файлы ў папцы праекта (прыклад 10.1).

Каб праграма магла працаваць з файламі, неабходна паказаць імёны гэтых файлаў і вызначыць, для якой мэты патрэбен файл — для ўводу ці для вываду.

Для работы з файламі выкарыстоўваюцца спецыяльныя тыпы даных, якія называюцца патокамі. Паток ifstream служыць для работы з файламі ў рэжыме чытання (увод даных). Паток ofstream служыць для работы з файламі ў рэжыме запісу (вывад даных). У праграмах на C++ пры рабоце з тэкставымі файламі неабходна падключаць бібліятэку fstream (прыклад 10.2).

Прыклад 10.1. Файлы input.txt (для ўводу даных) і output.txt (для вываду) у папцы праекта.

Прыклад 10.2. Каманды для работы з файламі:

#include <fstream>

 

using namespace std;

 

int main()

{

  ifstream fin("input.txt");

  ofstream fout("output.txt");

  …

  return 0;

}    

Каманда ifstream fin("input.txt") звязвае файлавы паток з імем fin і тэкставы файл input.txt, прызначаны для чытання даных з яго. У праграме імя файлавага патоку fin будзе выкарыстоўвацца тады, калі трэба ўвесці даныя (па сутнасці, fin будзе выкарыстоўвацца замест cin).

Каманда ofstream fout("output.txt") звязвае файлавы паток з імем fout і тэкставы файл output.txt, прызначаны для запісу даных у яго. У праграме імя файлавага патоку fout будзе выкарыстоўвацца тады, калі трэба вывесці даныя (па сутнасці, fout будзе выкарыстоўвацца замест cout).

Імя файлавага патоку з’яўляецца ідэнтыфікатарам, карыстальнік можа выбраць яго адвольна.

Калі неабходна працаваць з некалькімі файламі адначасова, то кожны файл звязваюць са сваім патокам для чытання або запісу даных.

Калі ўзнікае неабходнасць спачатку запісаць што-небудзь у файл, а затым прачытаць з яго, то трэба спярша закрыць паток для чытання і толькі потым звязваць файл са струменем для запісу. Для закрыцця выкарыстоўваецца каманда fin.close();

10.2. Чытанне і запіс лікавых даных

Прыклад 10.3. Напісаць праграму, якая счытвае з тэкставага файла лікі і ўзводзіць у квадрат дадатныя лікі і замяняе адмоўныя лікі іх модулем. Вынік работы праграмы запісваецца ў тэкставы файл. Структура ўваходнага файла: у першым радку запісаны лік, які абазначае колькасць лікаў у файле; у другім радку — самі лікі, падзеленыя прабелам.

Этапы выканання задання

I. Зыходныя даныя: пераменная n (колькасць), пераменная x (бягучы лік) .

II. Вынік: пераўтвораныя лікі

 III. Алгарытм рашэння задачы.

1. Увод з файла колькасці лікаў.
2. У цыкле for:

2.1. Чытаем лік з файла. 
2.2. Правяраем і пераўтвараем лік..
2.3. Запісваем лік у файл

IV. Апісанне пераменных: n, x, r – int.

Пры стварэнні тэкставых файлаў трэба памятаць, што расшырэнне .txt праграма Блокнот прыпісвае па змоўчанні. Калі дапісаць расшырэнне ўручную, то атрымаем файл з імем input.txt.txt. Праграма не знойдзе файл для чытання даных, адпаведна, файл з вынікамі работы будзе пустым.

Прыклад 10.3.

V. Праграма:

#include <fstream>

 

using namespace std;

 

int main()

{

  ifstream fin("input.txt");

  ofstream fout("output.txt");

  int n;

  fin >> n;

  for (int i = 0; i < n; i++){

    int x, r;

    fin >> x;

    if (> 0)

      r = x * x;

    else

      r = -x;

    fout << r << " ";

  }

  return 0;

}

VI. Тэсціраванне.

1. Стварыць тэкставы файл input.txt у папцы праекта.


2. Запусціць праграму. Пры запуску праграмы ў кансольным акне выводзіцца толькі час работы праграмы.
3. Адкрыць створаны праграмай файл output.txt.

10.3. Чытанне і запіс радковых даных

Прыклад 10.4. Напісаць праграму, якая счытвае з тэкставага файла радкі і выводзіць у іншы тэкставы файл тыя з іх, якія не змяшчаюць ніводнага прабелу. Структура ўваходнага файла: у першым радку запісаны лік n, які абазначае колькасць радкоў у файле, далей запісана n радкоў.

Этапы выканання задання

I. Зыходныя даныя: пераменная n (колькасць), пераменная st (бягучы радок).

II. Вынік: выбраныя радкі.

III. Алгарытм рашэння задачы.

1. Увод з файла колькасці радкоў. Паколькі пасля ліку ў файле стаіць сімвал пераводу радка, то неабходна ачысціць буфер даных. У цыкле for:

2.1. Чытаем радок з файла. 
2.2. Правяраем, ці ёсць у ім прабелы. Калі так, то запісваем радок у файл.

IV. Апісанне перfменных: n – int, st – string.

Прыклад 10.4.

V. Праграма:

#include <fstream>

 

using namespace std;

 

int main()

{

  ifstream fin("input.txt");

  ofstream fout("output.txt");

  int n;

  fin >> n;

  fin.ignore();

  for (int i = 0; i < n; i++){

    string st;

    getline(fin, st);

    if (st.find(' ') == -1)

     fout << st << endl;

  }

  return 0;

}

 VI. Тэсціраванне.

1. Файл input.txt.

2. Файл output.txt

10.4. Сумеснае выкарыстанне файлаў і кансолі

Прыклад 10.5. Напісаць праграму, якая счытвае з тэкставага файла лікі і знаходзіць сярод іх максімальнае па значэнні. Вынік работы праграмы выводзіцца на кансоль. Структура ўваходнага файла. У першым радку запісаны лік, які абазначае колькасць лікаў у файле. У другім радку самі лікі, падзеленыя прабелам.

Этапы выканання задання

I. Зыходныя даныя: пераменная n (колькасць), пераменная x (бягучы лік) .

II. Вынік: пераўтвораныя лікі.

III. Алгарытм рашэння задачы.

1. Пераменную для захоўвання максімальнага значэння ініцыялізуем мінімальна магчымым значэннем тыпу int - INT_MIN.
2. Увод з файла колькасці лікаў.
 
3. 
У цыкле for:

3.1. Чытаем лік з файла. 
3.2. Правяраем счытаны лік. Калі ён большы за бягучае максімальнае значэнне, то змяняем бягучае максімальнае значэнне.

4. Вывад выніку.

IV. Апісанне пераменных: n, x, Max – int.

Прыклад 10.5.

V. Праграма:

#include <iostream>

#include <fstream>

 

using namespace std;

 

int main()

{

  ifstream fin("input.txt");

  ofstream fout("output.txt");

  int n;

  fin >> n;

  int Max = INT_MIN;

  for (int i = 0; i < n; i++){

    int x;

    fin >> x;

    if (> Max)

      Max = x;

  }

  cout << "Max= " << Max << endl;

  return 0;

}

 VI. Тэсціраванне.

1. Файл input.txt.

2. Вынік.

Пытанні да параграфу

1. З якой мэтай выкарыстоўваюць тэкставыя файлы ў праграміраванні?

2. Якая каманда стварае паток для чытання з файла? Для запісу ў файл?

3. Якую бібліятэку трэба падключыць для работы з файламі?

Практыкаванні

    

1. Напішыце праграму, якая счытвае з тэкставага файла лікі і запісвае ў іншы тэкставы файл тыя з іх, якія з’яўляюцца поўнымі квадратамі. Структура ўваходнага файла: у першым радку запісаны лік, які абазначае колькасць лікаў у файле; у другім радку — самі лікі, падзеленыя прабелам.

2. Напісаць праграму, якая счытвае з тэкставага файла радкі і выводзіць у іншы тэкставы файл тыя з іх, у якіх ёсць словы, што пачынаюцца на ўведзеную з клавіятуры літару. Структура ўваходнага файла: у першым радку запісаны лік n, які абазначае колькасць радкоў у файле. Далей запісана n радкоў.

3. У файле запісаны тэкст. Напісаць праграму, якая знойдзе ў ім слова максімальнай даўжыні. Слова вывесці на кансоль. Структура ўваходнага файла: у першым радку запісаны лік n, які абазначае колькасць радкоў у файле. Далей запісана n радкоў.