Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Послідовний запис до файлу і послідовне читання з файлу

Поиск

Для запису інформації до файлу використовують операцію, яка є аналогом операції 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 с.)