Чтение и запись текстовых файлов
Потоки для работы с текстовыми файлами представляют объекты, для которых не задан режим открытия ios::binary.
Запись в файл
Для записи в файл к объекту ofstream или fstream применяется оператор << (как и при выводе на консоль):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <fstream>
int main()
{
std::ofstream out; // поток для записи
out.open("D:\\hello.txt"); // окрываем файл для записи
if (out.is_open())
{
out << "Hello World!" << std::endl;
}
std::cout << "End of program" << std::endl;
return 0;
}
Данный способ перезаписывает файл заново. Если надо дозаписать текст в конец файла, то для открытия файла нужно использовать режим ios::app:
1
2
3
4
5
6
std::ofstream out("D:\\hello.txt", std::ios::app);
if (out.is_open())
{
out << "Welcome to CPP" << std::endl;
}
out.close();
Чтение из файла
Если надо считать всю строку целиком или даже все строки из файла, то лучше использовать встроенную функцию getline(), которая принимает поток для чтения и переменную, в которую надо считать текст:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <fstream>
#include <string>
int main()
{
std::string line;
std::ifstream in("D:\\hello.txt"); // окрываем файл для чтения
if (in.is_open())
{
while (getline(in, line))
{
std::cout << line << std::endl;
}
}
in.close(); // закрываем файл
std::cout << "End of program" << std::endl;
return 0;
}
Также для чтения данных из файла для объектов ifstream и fstream может применяться оператор >> (также как и при чтении с консоли):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <fstream>
#include <vector>
struct Operation
{
int sum; // купленная сумма
double rate; // по какому курсу
Operation(double s, double r) : sum(s), rate(r)
{}
};
int main()
{
std::vector<Operation> operations = {
Operation(120, 57.7),
Operation(1030, 57.4),
Operation(980, 58.5),
Operation(560, 57.2)
};
std::ofstream out("D:\\operations.txt");
if (out.is_open())
{
for (int i = 0; i < operations.size(); i++)
{
out << operations[i].sum << " " << operations[i].rate << std::endl;
}
}
out.close();
std::vector<Operation> new_operations;
double rate;
int sum;
std::ifstream in("D:\\operations.txt"); // окрываем файл для чтения
if (in.is_open())
{
while (in >> sum >> rate)
{
new_operations.push_back(Operation(sum, rate));
}
}
in.close();
for (int i = 0; i < new_operations.size(); i++)
{
std::cout << new_operations[i].sum << " - " << new_operations[i].rate << std::endl;
}
return 0;
}
Здесь вектор структур Operation записывается в файл.
1
2
3
4
for (int i = 0; i < operations.size(); i++)
{
out << operations[i].sum << " " << operations[i].rate << std::endl;
}
При записи в данном случае будет создаваться файл в формате
1
2
3
4
120 57.7
1030 57.4
980 58.5
560 57.2
Используя оператор >>, можно считать последовательно данные в переменные sum и rate и ими инициализировать структуру.
1
2
3
4
while (in >> sum >> rate)
{
new_operations.push_back(Operation(sum, rate));
}