Студопедия
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Форматированный файловый ввод-вывод

Читайте также:
  1. Введение в программирование на языке Pascal Работа с величинами. Ввод-вывод Выражения. Линейные алгоритмы
  2. ВВОД-ВЫВОД
  3. Ввод-вывод матриц
  4. Ввод-вывод чисел, символов и строк на консоль. Переключение ввода-вывода, работа с файлами.
  5. Задание 1. Ввод-вывод переменных.
  6. Занятие № 21. Файловый тип.
  7. Неформатированные файловый ввод-вывод
  8. Понятие физического и логического файла, файловый тип данных. Текстовые типизированные и нетипизированные файлы. Описание файловых типов.
  9. Потоковый ввод-вывод
  10. Строковые константы, массивы символьных строк и их инициализация. Указатели и строки, ввод-вывод и обработка строк.

1) Функции fgetc() и fputc() позволяют соответственно осуществить ввод-вывод символа.

2) Функции fgets() и fputs() позволяют соответственно осуществить ввод-вывод строки.

3) Функции fscanf() и fprintf() позволяют соответственно осуществить форматированный ввод-вывод и аналогичный соответствующим функциям форматированного ввода-вывода, только делают это применительно к файлу.

Организация работы с файлами средствами C++

Файловый ввод-вывод с использованием потоков

Библиотека потокового ввода-вывода

fstream

Файловый ввод/вывод аналогичен стандартному вводу/выводу, единственное отличие – это то, что ввод/вывод выполнятся не на экран, а в файл. Если ввод/вывод на стандартные устройства выполняется с помощью объектов cin и cout, то для организации файлового ввода/вывода достаточно создать собственные объекты, которые можно использовать аналогично операторам cin иcout.

Связь файла с потоком вывода

ofstream имя логического файла;

Связь файла с потоком ввода

ifstream имя логического файла;

Открытие файла

имя логического файла.open(имя физического файла);

Закрытие файла

имя логического файла.close();

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

Режимы открытия файла комбинируются с помощью операции поразрядного ИЛИ (|).

Например:

fstream fs("f1.txt", ios_base::in | ios_base::out | ios_base::trunk); // Открытие файла для чтения и записи с удалением содержимого файла
ifstream ifs("f2.txt", ios_base::in | ios_base::binary); // Открытие двоичного файла для чтения   Для записи в текстовый файл строки необходимо проделать следующие шаги: · создать объект класса ofstream; · cвязать объект класса с файлом, в который будет производиться запись; · записать строку в файл; · закрыть файл.

Для того чтобы прочитать файл понадобится выполнить те же шаги, что и при записи в файл с небольшими изменениями:

· создать объект класса ifstream и связать его с файлом, в который будет производиться запись;

· прочитать файл;

· закрыть файл.

Пример 4. Заполнить файл значениями функции y = x * cos x.

#include <cstdlib>

#include <iostream>

#include <fstream>

#include <cmath>

using namespace std;

 

double fun(double x)

{

return x*cos(x);

}

 

int main()

{

double a, b, h, x; char s[20];

cout << "Enter the beginning and end of the segment, step-tabulation: ";

cin >> a >> b >> h;

cout << "File name? "; cin >> s;

ofstream f;

f.open(s);

for (x=a; x<=b; x+=h)

{

f.width(10); f << x;

f.width(15); f << fun(x) << endl;

}

f.close();

return 0;

}

Пример 5. Файл содержит несколько строк, в каждой из которых записано единственное выражение вида a#b (без ошибок), где a, b - целочисленные величины, # - операция +, -, /, *. Вывести каждое из выражений и их значения.

#include <cstdlib>#include <iostream>#include <fstream> using namespace std;int main(){ long a, b; char s[256], c; int i; cout << "File name? "; cin >> s; ifstream f; f.open(s); while (!f.eof()) { f.getline(s, 256); i=0; a=0; while (s[i]>='0'&&s[i]<='9') { a=a*10+s[i]-'0'; i++; } c=s[i++]; b=0; while (s[i]>='0'&&s[i]<='9') { b=b*10+s[i]-'0'; i++; } switch (c) { case '+': a+=b; break; case '-': a-=b; break; case '/': a/=b; break; case '*': a*=b; break; } cout << s << " = " << a << endl; } f.close(); return 0;}

 

Для работы с двоичными файлами используются функции read и write. В качестве параметров функции получают указатель (типа char* для функции read и типа const char* для функции write), который задаёт адрес начала массива для ввода/вывода, и целое число, задающее количество байт для ввода/вывода.

Пример 1 (потоковый вывод). Заполнить бинарный файл некоторым количеством целых случайных чисел.

#include <cstdlib>#include <iostream>#include <fstream> using namespace std;int main(){

ofstream f;

int dat;

srand(time(0));

int n=rand()%30+1;

cout << "File name? ";

char s[20];

cin.getline(s, 20);

f.open(s,ios::binary|ios::out|ios::trunc);

for (int i=1; i<=n; i++)

{

dat = rand()%101 - 50;

cout << dat << " ";

f.write((char *)&dat,sizeof(int));

}

cout<<endl;

f.close();

return 0;}

Пример 6. (потоковый ввод). Подсчитать сумму ряда целых чисел, заданных в бинарном файле.

#include <iostream>

#include <fstream>

#include <string>

using namespace std;

int main()

{

ifstream f;

int dat, n=0, sum=0;

cout << "File name? ";

char s[20];

cin.getline(s, 20);

f.open(s, ios::binary|ios::in);

while (f.read((char *)&dat,sizeof(int)))

{

n++;

cout << dat << " ";

sum+=dat;

}

// while (1)

// {

// f.read((char *)&dat,sizeof(int));

// if (f.eof())

// break;

// n++;

// cout << dat << " ";

// sum+=dat;

// }

cout << endl;

cout << "sum: " << sum << "; number: " << n << endl;

f.close();

return 0;

}

 

 

Пример 7. Чтение и запись структуры в файл.

#include <cstring>

#include <iostream>

#include <fstream>

 

using namespace std;

 

struct mystruct {

long i;

char buf[255];

double d;

};

int main()

{

const char *FName="my_struct.dat"; //Путь к файлу

mystruct X;

//memset(&ms,0,sizeof ms); //можно проинициализировать элементы структуры нулями так

X.i = 10; //записали значение в поле i

X.d = 2; //записали значение в поле d

strcpy(X.buf,"some text"); //Записали значение в поле buf

// открываем файл для записи

ofstream f(FName,ios::binary|ios::out);

f.write((char*)&X,sizeof X); //Записали всю структуру целиком

f.close();

strcpy(X.buf,"\0"); //изменяем поле buf струтктуры X

X.i=0; //изменяем поле i структуры X

//открываем файл для чтения

ifstream in(FName,ios::binary|ios::in);

in.read((char*)&X,sizeof X); //Читаем структуру целиком сразу

in.close();

cout<<X.buf<<"\n"; //Выводим значение из поля структуры. Оно равно some text

return 0;

}

 

 




Дата добавления: 2014-12-19; просмотров: 113 | Поможем написать вашу работу | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2025 год. (0.013 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав