269.50K
Категория: ПрограммированиеПрограммирование

Работа с файлами (С/С++)

1.

Работа с файлами (С/С++)
Файлы:
1. Текстовые
Текстовые файлы кодируются при помощи таблицы кодов ASCII
и состоят из строк, которые завершаются символом конца строки.
2. Двоичные
Двоичный файл является аналогом внутренней (оперативной,
физической) памяти – неограниченным массивом байтов с
возможностью непосредственного обращения (произвольного
доступа) к любой его части.
Файлы (С++)
Заголовочный файл <fstream>
Поточные классы для работы с файлами:
ofstream - для вывода (записи) данных в файл;
ifstream - для ввода (чтения) данных из файла;
fstream - для чтения и для записи данных (двунаправленный
обмен).

2.

Для организации файлового ввода/вывода необходимо:
1. Создать собственные объекты описанных классов
Пример: ofstream имя_объекта; (например: ofstream ff;)
2. Связать их с файлами
Пример: ff.open("dan.txt"); //метод open
3. Произвести ввод/вывод, используя аналогично операторам cin и
cout
Пример: ff << “Это запись текста в файл”<<endl;
4. Закрыть файлы.
Пример: ff.close(); //метод close
Шаги 1 и 2 можно объединять: ofstream ff("dan.txt");

3.

Класс ifstream (методы)
Метод
Описание
open
Открывает файл для чтения
get
Читает один или более символов из файла
getline
Читает символьную строку из текстового файла или
данные из бинарного файла до определенного
ограничителя
read
Считывает заданное число байт из файла в память
eof
Возвращает ненулевое значение (true), когда указатель
потока достигает конца файла
peek
Выдает очередной символ потока, но не выбирает его
seekg
Перемещает указатель позиционирования файла в
заданное положение (с объектами классов ifstream и
fstream)
tellg
Возвращает текущее значение указателя
позиционирования файла
close
Закрывает файл

4.

Класс ofstream (методы)
Метод
Описание
open
Открывает файл для записи
put
Записывает одиночный символ в файл
write
Записывает заданное число байт из памяти в файл
seekp
Перемещает указатель позиционирования в указанное
положение (с объектами классов ofstream и fstream)
tellp
Возвращает текущее значение указателя
позиционирования файла
close
Закрывает файл

5.

Все поточные классы ввода-вывода являются косвенными
производными от общего предка ios, полностью наследуя его
функциональность. Режим открытия файлов может использовать
флаги.
Возможные значения флагов и их назначение.
Режим
Назначение
in
Открыть для ввода (выбирается по умолчанию для ifstream)
out
Открыть для вывода (выбирается по умолчанию для
ofstream)
binary
Открыть файл в бинарном виде
app
Присоединять данные; запись в конец файла
ate
Установить файловый указатель на конец файла
trunc
Уничтожить содержимое, если файл существует (выбирается
по умолчанию, если флаг out указан, а флаги ate и арр —
нет)
nocreate
Если файл не существует, то новый файл не создается
noreplace Если файл уже существует, файл не перезаписывается

6.

Функция is_open()
Возвращает целые значения: 1 — если файл был успешно открыт,
0 — если файл открыт не был.
Пример. Вывести сообщение об ошибке открытия файла (например,
он не существует).
ifstream gg;
gg.open ("test.txt”);
If (!gg.is_open()) // если файл не открыт
cout << "Файл не может быть открыт!\n"; // сообщить об этом
else
{...}
Проверку корректного открытия файла можно выполнять также
следующим образом:
if (! gg) { cerr<”Error: unable to write to out.txt”<<endl; exit(1);}

7.

Операторы включения и извлечения
Переопределённый в классах работы с файлами
включения (<<) записывает данные в файловый поток.
оператор
Пример.
ofstream file;
file.open (“rez.txt”);
file << “Эта сторока записывается в файл”<<endl;
int v = 100;
float pi = 3.14159;
file << v << endl << pi << endl;
Оператор извлечения (>>) производит обратные действия.
Пример.
ifstream file (“rez.txt");
char str[30]; int v; float pi;
file >> str >> v >> pi;
В примере оператор извлечения остановится на первом попавшемся
разделителе (символе пробела, табуляции или новой строки). Таким
образом, только слово “Эта" запишется в массив str, пробел игнорируется, а
слово “строка" станет значением целой переменной v и ничего хорошего не
получится.

8.

Исправляем:
Пример
ifstream file("Temp.txt");
char str[30];
int v;
float pi;
file.getline(str, sizeof(str));
file >> v >> pi;
Метод getline прочитает первую строку файла до конца, а
оператор ”>>” присвоит значения переменным.
При работе с текстовыми файлами наиболее часто встречаются
четыре действия:
- посимвольное чтение (get());
- посимвольная запись (put());
- построчное чтение (getline);
- построчная запись (file_out<<вывод).

9.

Признак конца файла
Признак конца файла приходится искать в файлах, открытых для чтения.
Этот признак устанавливается в тот момент, когда в файле не осталось больше
данных, которые можно считать.
Признак конца файла анализируется в выражении вида
while (! In_file.eof()){ … }
Для этой цели нельзя пользоваться циклом
do { … } while (! In_file.eof()), поскольку файл может оказаться пустым.
Однако проверка на конец файла не анализирует ошибки, которые могут
встретиться в процессе чтения файла. Для проверки как конца файла, так и
наличия ошибок при его чтении пользуются условием выхода из цикла:
while (In_file.good()) { … }
Оператор цикла
while (In_file) { … }
выполняется до тех пор, пока нет ошибок, в том числе и конца файла (EOF).

10.

Пример. Запись динамического массива структур в текстовый файл и
вывод из него на экран.
#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>
using namespace std;
struct stud {
//структура студент
string fio;
string n_gr;
int otc1, otc2;
};
void print(stud st[], int n) {
//функция печати полей структуры
cout << "N\tFIO\t"<<setw(20)<<"\t"<<setw(20)<<"Gruppa\t Balli\n";
cout << "===============================================\n";
for (int i = 0; i < n; i++)
cout <<i+1<<". "<<st[i].fio <<"\t" <<setw(20)<< st[i].n_gr << "\t" << st[i].otc1
<< "\t" << st[i].otc2 << endl;
cout << "---------------------------------------------------------------------------"<<endl;
}

11.

int main()
{ int n, i;
cout << "Vvedite kol-vo studentov" << endl;
cin >> n;
cin.ignore(); //игнорируем символ конца строки при вводе числа
stud *mstud = new stud[n]; //динамический массив структур
//Ввод информации о студентах
for (i = 0; i < n; i++)
{
cout << "Vvedite FIO: ";
getline(cin,mstud[i].fio);
cout << "Vvedite nomer gr: ";
cin>> mstud[i].n_gr;
cout << "Vvedite 2 otcenki:" << endl;
cin >> mstud[i].otc1;
cin.ignore();
cin >> mstud[i].otc2;
cin.ignore();
cout << endl;
}

12.

print(mstud, n); // вывод полей структуры с помощью функции
ofstream ff;
ff.open("test.txt");
ff<<n<<endl;
for (i = 0; i < n; i++) {
ff<<mstud[i].fio<<"\n"<<mstud[i].n_gr<<"\n"<<mstud[i].otc1
<<"\n"<< mstud[i].otc2 << endl;
}
ff.close();
cout << "--------------------------------------------------------------" << endl;
ifstream gg;
gg.open("test.txt");
if (!gg.is_open()) // если файл не открыт
cout <<"Файл не может быть открыт!\n"; // сообщить об этом
else
{ gg>>n;
if (n!=NULL) {
gg.ignore();

13.

for(int i=0;i<n;i++)
{
getline(gg,mstud[i].fio);
gg>>mstud[i].n_gr;
gg >> mstud[i].otc1;
gg.ignore();
gg>> mstud[i].otc2;
gg.ignore();
}
}
}
print(mstud, n); //вывод полей структуры с помощью функции
gg.close();
system("pause");
return 0;
}
English     Русский Правила