Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Послідовний запис до файлу і послідовне читання з файлуСодержание книги
Поиск на нашем сайте
Для запису інформації до файлу використовують операцію, яка є аналогом операції 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; просмотров: 76; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.20 (0.006 с.) |