Оператори за вход / изход. Работа с файлове Основни понятия. Стандартни потоци за вход и изход



Дата10.04.2018
Размер47.74 Kb.
26 въпрос

Оператори за вход / изход. Работа с файлове

  1. Основни понятия. Стандартни потоци за вход и изход

При въвеждане и извеждане на данни в езика С++ често се споменава понятието „поток” (stream). Потокът е последователност от байтове, които „текат” в една посока (при четене – вход; при запис - изход).

В езика С++ това се реализира чрез специални класове за вход и изход.

Във входно-изходните библиотеки класовете са няколко на брой:


  • ios – базов клас, съдържащ потоци;

  • istream – потоци за вход;

  • ostream – потоци за изход;

  • iostream – потоци за вход и изход;

  • ifstreamпотоци за вход от файл;

  • ofstream – потоци за изход към файл;

  • fstream – потоци за вход и изход, свързани с файл.

Двата най-често използвани потока cin и cout са тези за стандартния вход и изход, т.е. въвеждане от клавиатура и извеждане на екрана.

Потокът cin е клас от библиотеката istream. Той се свързва с въвеждане на входни данни от клавиатурата:



cin>>i1>>i2>>…>>in;

Операцията >> се използва за четене на цели и реални числа, както и на символни низове. При четене на повече от една стойности между тях трябва да има поне един празен интервал, табулатор или символ за нов ред.

Потокът cout е клас от библиотеката ostream. Той се свързва с извеждане на данни на екрана:

cout<1<2<<…<n;

Операцията << се използва за извеждане на цели и реални числа, както и на символни низове. При извеждане на повече от една стойности при нужда програмистът трябва да се погрижи за извеждането на разделители между тях, например: ‘\n’ (нов ред или endl), \t’ (табулатор), или един или повече интервали.

Ако в текста, който се извежда, трябва да бъдат използвани кавички, това става чрез \”.

Аналогично, ако желаете в символния низ да има знак \, използвайте две наклонени черти \\.

Двата стандартни потока cin и cout са дефинирани в заглавния файл (библиотека) iostream.h. Затова програмите, в които има въвеждане на данни от клавиатура и извеждане на данни на екрана, трябва да съдържат директивата към препроцесора:

#include


  1. Файлове и оператори за работа с потоци

В програмите често се налага входните данни да бъдат прочетени от файл, или получените резултати да бъдат записани във файл. Концепцията за потоците е приложена и при работа с файлове. Езикът С++ поддържа обекти от типа ifstream (входен файлов поток) и ofstream (изходен файлов поток). За да могат да бъдат използвани тези два потока, в началото на програмата трябва да се включи заглавния файл fstream.h като директива към препроцесора:

#include

Този заглавен файл автоматично включва в себе си iostream.h

За да се създадат обекти от тип файлов поток (файлови променливи), се използват оператори от типа:

ifstream fin(“c:\\data\\in-data.txt”);

ofstream fout(“c:\\data\\out-data.txt”);

fin и fout са примерни имена на файлови потоци.

Както по-горе беше споменато, компилаторът преобразува двойката наклонени черти \\ в една \, която се използва при задаването на директории.

След дефинирането на fin и fout те могат да бъдат използвани по подобие на cin и cout.

Обектите потоци връщат като резултат нулева стойност NULL ( ‘\0’ ), ако е възникнала грешка при четене, например е достигнат краят на файла.

Името на файла може да бъде въведено и от клавиатура:

char filename[40];

cout<<”Въведете име на файл: “; cin>>filename;

ofstream f_out(filename);

if (f_out == NULL)

cout <<”Грешка при отваряне на файла.\n” ;

else

cout<<”OK\n”;


  1. Операции с файлове

Основните операции с файлове могат да се разделят на 4 групи:

  • операции за създаване на файл;

  • операции за отваряне и затваряне на файл;

  • операции за избор на режим за работа с файл;

  • операции за позициониране във файл.

Тук се разглеждат само файлове с т.н. последователен достъп (текстови файлове).

При отваряне на файл само за запис използваме конструкцията:



ofstream <име_файлов_поток>(“име_файл”, ios::out);

Ако файлът със зададеното име не съществува, той бива създаден. Ако съществува, се нулира съдържанието му и записът започва отначало.

При отваряне на файл само за четене използваме конструкцията:

ifstream <име_файлов_поток>(“име_файл”, ios::in);

Освен параметрите in и out на ios, съществуват и други, които се задават с побитово ИЛИ ( отбелязва се с единична вертикална черта:| ):



ios::app – задава се режим за допълване на файла, ако той вече съществува;

ios::trunc – унищожава предишното съдържание на файла;

ios::binary - запис и четене на данни в т.н. бинарен режим.

Файлът, който се отваря за четене, трябва да съществува.

Съществува и още един вариант за отваряне на файл. При него предварително се дефинира обектът – поток, а по-късно се задава името на файла и режимът на достъп до него. Ето един пример за отваряне на файл с цел четене:

ifstream Fin;

Fin.open(filename,ios::in);



Fin.close();


Последният оператор затваря отворения файл.

Следват пример за функция, която чете едномерен масив от файл:



// Функцията чете от файл данни за точките.

// Функцията връща на извикващата част от програмата броя точки M (чрез псевдоним)

// и координатите на точките

void Open_Points(char fname[30], int &M, float X[Nmax], float Y[Nmax]) {

ifstream fin(fname,ios::in); // отваряне на файла за четене

fin>>M; // четене на брой точки

for (int i=0; i

fin>>X[i]>>Y[i]; // четене на X и Y координати за всяка точка

fin.close(); // затваряне на файла

}
Пример за функция, която чете матрица от файл:

// Функцията чете матрица от файл със зададено име и

// връща към извикващата част на програмата брой редове и колони, както и елементите на матрицата

// M и N са параметри, подадени чрез псевдоним, за да бъдат върнати обратно

// след завършването на функцията в техните оригинални променливи
void Open_Matrix(char fname[30], int &M, int &N, float A[Nmax][Nmax]) {

ifstream fin(fname,ios::in); // отваряне на входен файл с данни

fin>>M>>N; // четене на брой редове и брой стълбове от файла

for (int i=0; i

for (int j=0; j

fin>>A[i][j]; // четене на елементите на матрицата от файла

fin.close(); // затваряне на файла

}

Пример за функция, която записва матрица във файл:



// Функцията записва във файл матрицата

void Save_Matrix(char fname[30], int M, int N, float A[Nmax][Nmax]) {

ofstream fout(fname,ios::out); // отваряне на файла

fout<

for (int i=0; i

for (int j=0; j

fout<

fout<

}

fout.close(); // затваряне на файла

}

По материали от учебника по ПИИС – С++ на доц. Гергана Моллова


База данных защищена авторским правом ©obuch.info 2016
отнасят до администрацията

    Начална страница