Меню
Категории
Работаем с потоками на C++ ofstream и ifstream
30 марта, 2008 Программинг

Работаем с потоками на C++ ofstream и ifstream. В пример показана программка генерирующая HTML файл, с данными в таблице, которые мы введем в программу. Используем потоковый ввод/вывод.

Потоки для работы с файлами создаются как объекты следующих классов:

  • ofstream – для вывода (записи) данных в файл;
  • ifstream – для ввода (чтения) данных из файла;
  • fstream – для чтения и для записи данных (двунаправленный обмен).

Чтобы использовать эти классы, в текст программы необходимо включить дополнительный заголовочный файл fstream.h. После этого в программе можно определять конкретные файловые потоки, соответствующих типов (объекты классов ofstream, ifstream, fstream), например, таким образом:

  • ofstream outFile; // Выходной файловый поток.
  • ifstream inFile; // Входной файловый поток.
  • fstream ioFile; // Файловый поток для ввода и вывода.

Создание файлового потока (объекта соответствующего класса) связывает имя потока с выделяемым для него буфером и инициализирует переменные состояния потока. Так как перечисленные классы файловых потоков наследуют свойства класса ios, то и переменные состояния каждого файлового потока наследуются из этого базового класса. Так как файловые классы являются производными от классов ostream (класс ofstream), istream (класс ifstream), stream (класс fstream), то они поддерживают описанный в предыдущих шагах форматированный и бесформатный обмен с файлами. Однако прежде чем выполнить обмен, необходимо открыть соответствующий файл и связать его с файловым потоком.

Открытие файла в самом общем смысле означает процедуру, информирующую систему о тех действиях, которые предполагается выполнять с файлом. Существуют функции стандартной библиотеки языка С для открытия файлов fopen(), open(). Но работая с файловыми потоками библиотеки ввода-вывода языка С++, удобнее пользоваться компонентными функциями соответствующих классов.

Создав файловый поток, можно “присоединить” его к конкретному файлу с помощью компонентной функции open(). Функция open() унаследована каждым из файловых классов ofstream, ifsream, fstream от класса fstreambase. С ее помощью можно не только открыть файл, но и связать его с уже определенным потоком. Формат функции:

#include <fstream.h>
#include <conio.h>
#include <iostream.h>
#include <fcntl.h>
#include <io.h>

char k;
char name[100];
char opisanie[100];
char god[100];
char kolvo[100];
main()
{
if ((access(“index.html”,2))==-1)
{
ofstream bat(“index.html”,ios::app);
bat<<“<html><head><meta http-equiv=\”Content-Type\” content=\”text/html; charset=windows-1251\”>”<<endl;
bat<<“<title>[Каталог Компьютерных дисков]</title>”<<endl;
bat<<“</head><body bgcolor=\”#ffffff\”><table cellspacing=\”0\” border=\”0\” width=\”100%\”>”<<endl;
bat<<“<tr><td width=\”30%\” valign=\”middle\”><font size=\”2pt\” face=\”Tahoma\”><center><b>Каталог Компьютерных дисков.</b></center></font> </td></td></tr></table><br>”<<endl;
bat<<“<table cellspacing=\”0\” cellpadding=\”3\” border=\”1\” align=\”center\” width=\”100%\” bordercolor=\”#C9C9C9\”>”<<endl;
bat<<“<tr><td bgcolor=\”#e9e9e9\” align=\”center\”><font size=\”2pt\” face=\”Tahoma\”><b>Имя</b></font></td>”<<endl;
bat<<“<td bgcolor=\”#e9e9e9\” align=\”center\”><font size=\”2pt\” face=\”Tahoma\”><b>Описание</b></font></td>”<<endl;
bat<<“<td bgcolor=\”#e9e9e9\” align=\”center\”><font size=\”2pt\” face=\”Tahoma\”><b>Кол-во томов</b></font></td>”<<endl;
bat<<“<td bgcolor=\”#e9e9e9\” align=\”center\”><font size=\”2pt\” face=\”Tahoma\”><b>Год</b></font></td>”<<endl;
bat.close();
}

do
{
clrscr();
cout<<” !!! Вместо пробелов используйте \”_\” !!! “<<endl;
cout<<” Disk_List 1.0 – Програма для составлени списка дисков.”<<endl;
cout<<” Вводите все по очереди, и в текущей папке создастся файл HTML.”<<endl;
cout<<” Он и будет вашим списком. Его можно дописать запустив прогу.”<<endl;
cout<<“\nИмя диска: “;
cin>>name;
cout<<“\nОписане диска: “;
cin>>opisanie;
cout<<“\nКоличество томов : “;
cin>>kolvo;
cout<<“\nГод выпуска: “;
cin>>god;
ofstream bat(“index.html”,ios::app);
bat<<“<tr><td bgcolor=\”#ffffff\” valign=\”top\”><font size=\”2pt\” face=\”Tahoma\”>”<<name<<“</font></td>”<<endl;
bat<<“<td bgcolor=\”#ffffff\” valign=\”top\”><font size=\”2pt\” face=\”Tahoma\”>”<<opisanie<<“</font></td>”<<endl;
bat<<“<td bgcolor=\”#ffffff\” align=\”center\” valign=\”top\”><font size=\”2pt\” face=\”Tahoma\”>”<<kolvo<<“</font></td>”<<endl;
bat<<“<td bgcolor=\”#ffffff\” align=\”center\” valign=\”top\”><font size=\”2pt\” face=\”Tahoma\”>” <<god<<“</font></td></tr></tr>”<<endl;
bat.close();
cout<<“\n\tВыход (для выхода Y)? [Y/N]”;
cin>>k;
}
while (k!=’y’ || k!=’Y’ || k!=’ф’ || k!=’?’);
}

11 комментариев
  1. Все клево! но нельзя ли было переменные ближе к их использованию объявлять, а то путаница небольшая возникает

  2. нельзя ли задавать в качастве пути/имени удаленный компьютер? например (“\\192.168.1.1\qwe\1.txt”)

  3. Проверь.

  4. А почему бы вместо ifsteam и ofstream просто не использовать fstream, так же вроде удобнее.

  5. >>А почему бы вместо ifsteam и ofstream просто не использовать fstream, так же вроде удобнее.
    А сли у тя прав на запись нет? Или файловая смонтирована только на чтение? Твоя попытка открыть такой файо тихо умрёт верув -1. + если ты открыл файл толко на запись то никакой хакер черз твою программу не сможет прочесть его содержимое а это многого стоит.

  6. >> + если ты открыл файл толко на запись то никакой >>хакер черз твою программу не сможет прочесть его >>содержимое а это многого стоит.
    ухахах а ещё инопланетяне существуют;)

  7. Комментарий от Drakon4ik [ Октябрь 6, 2010, 06:54 ]

    есть методы граббинга информации с открытых удалённым пользователем окон. ок

  8. а можно читать посимвольно или кусками? а то взял прочитал файл с большим количеством пустых строк, так оказалось что нули и переводы строк этот >> полностью игнорирует. а мне именно нули были нужны.
    | | получилось ввелось как |||||| , записало первый символ, а при чтении пробелов ничего не поменялось. читал как

    char x = ‘r’;
    {
    somfile >> x;
    someotherfile << x;
    }while(80х25 не прочтется);

  9. Ахахаххх. Нашли решение вместо пробелов использовать _. А что использовать для перевода строки, ахахахх!!! Ржака-аббасака.

  10. О боже, видимо, мне не суждено стать программистом(

Добавить комментарий




*