Добавил:
ПОИТ 2016-2020 Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
40
Добавлен:
29.04.2018
Размер:
824.83 Кб
Скачать

Void main()

{ SetConsoleCP(1251);

SetConsoleOutputCP(1251);

St K;

cout<<"Введите текст "; cin>>K.ab;

fstream ft("A.bin");

ft.write((char*)&K, sizeof K);

ft.seekg(0);

ft.read((char*)&K, sizeof K);

ft.close();

cout<<K.ab<<"\n";

}

В контекстном меню консольного окна:

Свойства / Шрифт / Lucida Console

Пример. Программа использует функцию fail для проверки ошибочных ситуаций:

#include <iostream>

#include <fstream>

using namespace std;

Void main(void)

{ char line[256] ;

Ifstream prm2("a.Txt") ;

If (prm2.Fail())

cerr << "Ошибка открытия a.txt"<< endl;

else

{ while ((!prm2.eof()) && (! prm2.fail()))

{ prm2.getline(line, sizeof(line)) ;

if (! prm2.fail()) cout<<line<<endl;

}

}

prm2.close ();

}

enum io_state

{ goodbit, //нет ошибки

eofbit, //конец файла

failbit, //последняя операция не выполн.

badbit, //попытка исп. недопуст. операции

hardfail //фатальная ошибка

}

int fail(); //=1, если failbit, badbit или hardfail

Таким образом

  1. Заголовочный файл  fstream.h определяет классы ifstream и ofstream, с помощью которых программа может выполнять операции файлового ввода и вывода.

  2. Для открытия файла на ввод или вывод надо объявить объект типа ifstream  или ofstream, передавая конструктору этого объекта имя требуемого файла.

  3. После того как программа открыла файл для ввода или вывода, она может читать или писать данные, используя операторы извлечения (>>) и вставки (<<).

  4. Программы могут выполнять ввод или вывод символов в файл или из файла, используя функции get и put.

  5. Программы могут читать из файла целую строку, используя функцию getline.

  6. Большинство программ читают содержимое файла, пока не встретится конец файла. Программы могут определять конец файла с помощью функции eof.

  7. Когда программы выполняют файловые операции, они должны проверять состояние всех операций, чтобы убедиться, что операции выполнены успешно. Для проверки ошибок программы можно исп. функцию fail.

8. Если программам надо вводить или выводить такие данные, как структуры или массивы, они могут исп. методы read и write.

9. Если программа завершила работу с файлом, его следует закрыть с помощью функции close.

??system("chcp1251");

//Дан текстовый файл

//abcd

//efg

//hi

//j

//Вычислить его длину в байтах и сохранить ее в конце файла.

//Кроме того, каждый раз при встрече символа новой строки сохранить текущее смещение в конце файла.

#include <iostream>

#include <fstream>

using namespace std;

void main()

{

setlocale (LC_ALL, "rus");

fstream Pz; // объявили файловый поток в режиме чтения/записи

Pz.open ("copy.txt", fstream::in | fstream::app); // открыли файловый поток в режиме чтения / записи в конец файла

int mark=0; // отметка текущей позиции в файле

int cnt=0; // количество байт

char ch; // переменная для хранения текущего считываемого символа

Pz.seekg(0); // установили указатель для чтения в первую позицию, но можно и без этого, указатель и без того там

while (Pz.get(ch)) // взяли в ch следующий символ из потока

{

cout << ch; // напечатали его

cnt++; // добавили еще байтик к размеру

if ( ch == '\n' ) // при обнаружении символа перехода на новую строку

{

mark = Pz.tellg(); // отметили позицию, на которой он встретился

cout<<mark<<endl;

Pz.seekp(ios::end); // вот эта строка добавлена к вашему коду --- установили указатель для записи в конец файла, иначе запись запрещена, поэтому и не пишет

Pz<<mark<<" "; // и здесь была ошибка, надо записывать в поток не cnt, а mark,

// т.к. пишем в файл позицию, на которой встречается перевод строки

Pz.seekg(mark); // вернули указатель для чтения в нужную позицию

}

}

Pz << cnt; // сохраняем размер файла в байтах в файл, а вот это у меня не записывается, и я дальше объясню почему!

Pz.close(); // закрыли файловый поток

cout << "[ " << cnt << " ]\n"; // напечатали количество байт

}

//Когда я хожу по файлу в потоке при помощи seekp() и seekg(), я могу выбрать любую позицию. Но когда я выхожу из цикла,

//я уже вне(!) файлового потока, и не могу выбрать себе позицию.

//Поэтому для записи количества байт в конец файла, я его должна открыть для дозаписи, записать туда cnt и закрыть.

//Но! в этом и есть неудовлетворенность - я же дописала в файл значения позиций, поэтому размер файла увеличился,

//поэтому cnt уже не размер исходного, а размер полученного файла, плюс я еще раз открываю/закрываю поток, а это некомильфо.

//Короче, здесь я скисла :) Пока я писала, меня осенила мысль, что я могу два файловых потока привязать к одному файлу,

//в один читать, в другой писать. Пойду пробовать, получится - пришлю.

//И еще отправляю вам хороший примерчик - замена двух букв между собой на позициях i и j (на функции seekp() и seekg() ):

fstream file; // описание файлового потока

file.open("copy.txt", ios::binary | ios::out |ios::in);

int i=1,j=2;

char b='t',c='p';

file.seekg(i);

file.get(b);

file.seekp(i);

file.put(c);

file.seekp(j);

file.put(b);

Соседние файлы в папке Лекции