Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Послідовний запис до файлу і послідовне читання з файлу↑ ⇐ ПредыдущаяСтр 20 из 20 Содержание книги
Поиск на нашем сайте Для запису інформації до файлу використовують операцію, яка є аналогом операції cout <<:
fn << блок 1 << блок 2 << … << блок n;
Запишемо в файл деяку інформацію:
#include <iostream> #include <fstream> using namespace std; int main() { ofstream fn ("test.txt", ios::out); if (!fn) { cout << "Error opening file\n"; exit(1); } fn << "Line 1" << endl << "Line 2"; fn.close(); } Для читання з файлу використовують операцію, яка є аналогом операції cin >>:
fn >> блок 1 >> блок 2 >> … >> блок n;
Виведемо на екран зміст файлу, який був створений попередньою програмою:
#include <iostream> #include <fstream> using namespace std; int main() { char buf[ 20 ]; ifstream fn ("test.txt", ios::in); if (!fn) return 1; while (! fn.eof()) { //fn >> buf; // Зчитати слово з файлу fn.getline(buf, sizeof(buf)); cout << buf << endl; } fn.close(); } Дані будуть читатися до тих пір, поки не буде досягнуто кінець файлу – в цьому випадку функція fn.eof() поверне нульове значення. Для читання з файлу можна використовувати оператор fn >> buf; який прочитає з файла слово і запише його в масив buf. Слово закінчується першим пробільним символом. Для того, щоб прочитати рядок символів, можна використовувати функцію fn.getline(buf, sizeof(buf)); Аргументами функції є адреса буфера, в якому необхідно зберегти прочитаний рядок, і розмір цього буфера. При збереженні чисел в файлі їх зручно відділяти одне від одного одним чи декількома пробільними символами:
#include <iostream> #include <fstream> using namespace std; int main() { ofstream fout ("test.txt", ios::out); if (!fout) return 1; for (int i = 1; i <= 10; i++) fout << i << " " << double(i) / (i + 1) << (i < 10? "\n": ""); fout.close();
int t; double d; ifstream fin ("test.txt", ios::in); if (!fin) return 1; while (! fin.eof()) { fin >> t >> d; cout << t << "\t" << d <<endl; } fin.close(); }
Так само можна читати рядки символів. Але необхідно пам’ятати, що операція >> буде повертати одне слово.
#include <iostream> #include <fstream> using namespace std; int main() { ofstream fout ("test.txt", ios::out); if (!fout) return 1; fout << "One " << 1 << endl; fout << "Two " << 2; fout.close(); char c[ 10 ]; int t; ifstream fin ("test.txt", ios::in); if (!fin) return 1; while (! fin.eof()) { fin >> c >> t; cout << c << "\t" << t <<endl; } fin.close(); } Файли з довільним доступом Функція write класу ostream виводить фіксоване число байтів, починая з заданого місця в пам'яті, в заданий поток. Якщо потік зв’язаний з файлом, дані будуть записані починая з позиції в файлі, заданої вказівника позиції в файлі put. Функція read класу istream виводить фіксоване число байтів з заданого потоку в ділянку пам'яті, починая з вказаної адреси. Якщо потік пов’язаний з файлом, байти виводяться починая з позиції в файлі, заданої за допомогою вказівника позиції в файлі get. Таким чином, для того, щоб записати в файл значення змінної цілого типу з іменем number замість використання оператору
outFile << number;
який може записати для чотирибайотовго цілого від одного до 11 символів (до 10 розрядів плюс знак, для кожного необхідний один байт пам'яті), можна використовувати оператор
outFile.write((char *) &number, sizeof(number));
який завжди буде записувати в файл 4 байта для чотирибайтового цілого. Тип першого аргументу функції write це char *, тому необхідно використовувати перетворення типів. Другий аргумент визначає число байтів, які необхідно записати. Зазвичай функція write використовується для запису в файл значень структурних змінних. Створемо програму для обробки інформації про 5 студентів вищого навчального закладу. Для кожного з студентів необхідно зберігати порядковий номер, прізвище, ім’я, по батькові, рейтинг (дійсне число від 0 до 5). Спочатку створемо з незаповненими структурами для кожного студента – код дорівнює нулю, замість прізвища, ім’я, по батькові – порожній рядок, рейтинг 0.0.
#include <iostream> #include <fstream> using namespace std; int main() { struct student { int id; char pib[ 20 ]; double rating; }; const int N = 5; ofstream fout ("test.txt", ios::out); if (!fout) return 1; student s = { 0, "", 0.0 }; for (int i = 1; i <= N; i++) fout.write((char *) &s, sizeof(student)); fout.close(); }
Для запису даних в файл будемо використовувати функцію seekp, яка встановлює вказівник файлу put в задану позицію в файлі. У функції один параметр – ціле число, номер байта, на який необхідно встановити вказівник put.
#include <iostream> #include <fstream> using namespace std; int main() { struct student { int id; char pib[ 20 ]; double rating; }; const int N = 5; student s[ N ] = { { 4, "Ddd A.A.", 4.4 }, { 3, "Ccc A.A.", 3.3 }, { 2, "Bbb A.A.", 2.2 }, { 5, "Eee A.A.", 5.5 }, { 1, "Aaa A.A.", 1.1 } }; ofstream fout("test.txt", ios::out); if (!fout) return 1; for (int i = 0; i < N; i++) { fout.seekp((s[ i ].id - 1) * sizeof(student)); fout.write((char *) &s[ i ], sizeof(student)); } fout.close(); }
Функція read класу istream читає в об’єкт задану кількість байтів з поточної позиції у потоці. Перший аргумент функцій – вказівник на char- адреса в пам'яті, в яку необхідно записати інформацію, другий вказівник – ціле число, кількість байтів, які необхідно прочитати.
#include <iostream> #include <fstream> using namespace std; int main() { struct student { int id; char pib[ 20 ]; double rating; }; student s; ifstream fin("test.txt", ios::in); if (!fin) return 1; fin.read((char *) &s, sizeof(student)); while (! fin.eof()) { cout << s.id << "\t" << s.pib << "\t" << s.rating <<endl; fin.read((char *) &s, sizeof(student)); } fin.close();}
Посилання Призначення посилань Посилання призначені для створення псевдонімів об’єктів програми. Раніше ми використовували вказівники, які зберігали адреси обїектів програми, і через вказівники отримували доступ до цих об’єктів. При цьому використовували дві операції – визначення адреси (&) і звертання за адресою *. Посилання надають майже ті самі можливості, що і вказівники, але мають більш простий синтаксис. Визначення посилання має такий синтаксис:
тип & ім’я_посилання ім’я_змінної;
При створенні посилання його необхідно ініціалізувати за допомогою імені іншого об’єкту програми. Після цього посилання буде діяти як альтернативне ім’я даного об’єкту, всі операції над посиланням в дійсності будуть виконуватися над цим об’єктом.
#include <iostream> using namespace std; int main() { int a; int &r = a; a = 123; cout << "a = " << a << endl; // 123 cout << "r = " << r << endl; // 123 r = 321; cout << "a = " << a << endl; // 321 cout << "r = " << r << endl; // 321 }
Посилання, на відміну від вказівників, обов’язково необхідно ініціалізувати. Якщо це не зробити, виникне помилка компіляції. Операція визначення адреси, застосована до посилання, повертає адресу об’єкту, псевдонімом якого є це посилання. В наступному прикладі на екран буде виведена адреса змінної а:
#include <iostream> using namespace std; int main() { int a; int &r = a; cout << "&a = " << &a << endl; cout << "&r = " << &r << endl; }
Після створення і ініціалізації посилання завжди буде псевдонімом одного і того самого об’єкту:
#include <iostream> using namespace std; int main() { int a = 123, b = 321; int &r = a; cout << "a = " << a << endl; // 123 r = b; cout << "a = " << a << endl; // 321 }
Посилання може бути псевдонімом об’єкту будь-якого, в тому числі визначеного користувачем, типу. В наступному прикладі посилання є псевдонімом змінної структурного типу.
#include <iostream> using namespace std; int main() { struct student { int id; int rating; } s = { 1, 85 }; student &r = s; cout << r.id << endl; }
|
||
Последнее изменение этой страницы: 2021-12-15; просмотров: 36; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.140.185.250 (0.005 с.) |