Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Ввод/вывод с диска



Библиотека iostream включает много классов, порожденных из streambuf, ostream и istream, предоставляя, таким образом, широкий выбор методов ввода/вывода файлов. Класс filebuf например, поддерживает ввод/вывод через дескрипторы файлов с помощью функций элементов для открытия, закрытия и поиска.

Наиболее часто используемыми классами являются ifstream (порожденный из istream), ofstream (порожденный из ostream) и fstream (порожденный из iostream). Все они поддерживают форматированный файл ввода/вывода, используя объекты filebuf. Ниже приведен простой пример, который копирует существующий дисковый файл в другой заданный файл:

/* DCOPY исходный файл / файл назначения ** копирует существующий исходный файл в файл назначения ** Если последний существует, то он перезаписывается; ** если не существует, DCOPY создаст его, если это возможно **/#include <iostream.h>#include <process.h> // для exit()#include <fstream.h> // для ifstream, ofstreamint main(int argc, char* argv[]) { char ch; if (argc!= 3) // проверка числа аргументов { cerr << "USAGE: dcopy file1 file2\n"; exit(-1); } ifstream source; // объявить входной и выходной потоки ofstream dest; source.open(argv[1],ios::nocreate); // должен быть исходный файл if (!source) { cerr << "Cannot open source file " << argv[1] << " for input\n"; exit(-1); } dest.open(argv[2]); // файл назначения будет создан, если // не он найден или создан/перезаписан, если найден if (!dest) { cerr << "Cannot open destination file " << argv[2] << " for output\n"; exit(-1); } while (dest && source.get(ch)) dest.put(ch); cout << "DCOPY completed\n"; source.close(); // закрыть оба потока dest.close();}

Типичный вызов этой программы в командной строке выглядит следующим образом:

dcopy letter.spr letter.bak

Пример 2. Разработать программу для ввода/вывода с диска массива структур.

#include <iostream.h>#include <fstream.h> int main(int argc, char* argv[]){ struct emp { char* name; int dept; }; emp e[2]; e[0].name="aaaa"; e[0].dept=1; e[1].name="bbbbbbb"; e[1].dept=2; ifstream source; ofstream dest; char filename[20]="s.dat"; dest.open(filename); for(int i=0;i<2;i++) dest<<e[i].name<<" "<<e[i].dept<<endl; dest.close(); source.open(filename,ios::nocreate); // файл должен быть создан for(int i=0;i<2;i++) { source>>e[i].name>>e[i].dept; cout<<e[i].name<<" "<<e[i].dept<<endl; } source.close(); cin.get(); return 0;}

При этом файл s.dat содержит следующие данные:

aaaa 1bbbbbbb 2

Если поле name может содержать пробелы, то такой способ ввода/вывода непригоден. Нужно использовать разделитель полей, отличный от пробела, например, @.

for(int i=0;i<2;i++) dest<<e[i].name<<"@"<<e[i].dept<<endl;

Теперь чтение данных будет выглядеть следующим образом:

char buf[22];for(int i=0;i<2;i++){ source.get(e[i].name, 100, '@'); source.get(); //отбросить @ source.get(buf, 100, '\n'); source.get(); //отбросить \n e[i].dept=atoi(buf); cout<<e[i].name<<" "<<e[i].dept<<endl;}




Дата публикования: 2015-01-13; Прочитано: 207 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...