26 въпрос
Оператори за вход / изход. Работа с файлове
-
Основни понятия. Стандартни потоци за вход и изход
При въвеждане и извеждане на данни в езика С++ често се споменава понятието „поток” (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
-
Файлове и оператори за работа с потоци
В програмите често се налага входните данни да бъдат прочетени от файл, или получените резултати да бъдат записани във файл. Концепцията за потоците е приложена и при работа с файлове. Езикът С++ поддържа обекти от типа 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”;
-
Операции с файлове
Основните операции с файлове могат да се разделят на 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(); // затваряне на файла
}
По материали от учебника по ПИИС – С++ на доц. Гергана Моллова
Сподели с приятели: |