- •Int fact(int n)
- •Int fact(int n)
- •Void main()
- •Void main()
- •Void main()
- •Int AkkR(int m, int n);
- •Int main()
- •Int AkkR(int m, int n)
- •Int main()
- •Int smacc(int, int);
- •Int test(char *s, char *r)
- •Void main() { Stepp(""); }
- •Int step(int X, int y)
- •If (step(X-1, y))
- •If (step(X, y-1))
- •Void main(void)
- •Void main()
- •Int rings;
- •Init(rings);
- •Void convert (int z)
- •Void f(struct man *q)
- •Int mark[4];
- •Void main()
- •Void proc(man *p)
- •Void main()
- •Void main()
- •Int telephon;
- •Void main()
- •Void fNumber(number * const doc)
- •Void main()
- •Int main()
- •Void main()
- •Void main()
- •Void main()
- •Int fgets (char *s, int m, file *f);
- •Int fputs (char *s, file *f);
- •Void main()
- •Int fread( void *ptr, int size, int n,
- •Int fwrite( void *ptr, int size, int n,
- •Int rate;
- •Void main()
- •Int fseek(file *fp, long pos, int mode);
- •Void main()
- •Int np, n, I; long p[5]; char str[80];
- •Void main()
- •Int main() {
- •Int fread (void *buf, int size, int nrec, file *fd);
- •Int fwrite (void *buf, int size, int nrec, file *fd);
- •Int main()
- •Int main()
- •Infl.Open(“a.Txt”);
- •If (!infl) … //открытие успешно
- •Int main()
- •Inout.Seekg(0);
- •Int main()
- •Void main()
- •Void main()
- •Void main(void)
- •Ifstream prm2("a.Txt") ;
- •If (prm2.Fail())
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
Таким образом
Заголовочный файл fstream.h определяет классы ifstream и ofstream, с помощью которых программа может выполнять операции файлового ввода и вывода.
Для открытия файла на ввод или вывод надо объявить объект типа ifstream или ofstream, передавая конструктору этого объекта имя требуемого файла.
После того как программа открыла файл для ввода или вывода, она может читать или писать данные, используя операторы извлечения (>>) и вставки (<<).
Программы могут выполнять ввод или вывод символов в файл или из файла, используя функции get и put.
Программы могут читать из файла целую строку, используя функцию getline.
Большинство программ читают содержимое файла, пока не встретится конец файла. Программы могут определять конец файла с помощью функции eof.
Когда программы выполняют файловые операции, они должны проверять состояние всех операций, чтобы убедиться, что операции выполнены успешно. Для проверки ошибок программы можно исп. функцию 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);