Работа с файлами с использованием конструкций языка Си была рассмотрена здесь.
Для программиста открытый файл представляется как последовательность считываемых или записываемых данных. При открытии файла с ним связывается поток ввода-вывода. Выводимая информация записывается в поток, вводимая информация считывается из потока.
Для работы с файлами необходимо подключить заголовочный файл <fstream>. В нем определены несколько классов и подключены заголовочные файлы
- <ifstream> — файловый ввод ;
- <ofstream> — файловый вывод.
Файловый ввод-вывод аналогичен стандартному вводу-выводу, единственное отличие – это то, что ввод-вывод выполнятся не на экран, а в файл.
Если ввод-вывод на стандартные устройства выполняется с помощью объектов cin и cout, то для организации файлового ввода-вывода достаточно создать собственные объекты, которые можно использовать аналогично этим операторам.
При работе с файлом можно выделить следующие этапы:
- создать объект класса fstream (возможно, ofstream или ifstream);
- связать объект класса fstream с файлом, который будет использоваться для операций ввода-вывода;
- осуществить операции ввода-вывода в файл;
- закрыть файл.
2
3
4
5
6
7
8
9
10
using namespace std;
int main()
{
ofstream fout;
fout.open("file.txt");
fout << "Привет, мир!";
fout.close();
return 0;
}
В результате будет создан файл
Режимы открытия файлов устанавливают характер использования файлов. Для установки режима в классе ios предусмотрены константы, которые определяют режим открытия файлов.
Константа | Описание |
ios::in | открыть файл для чтения |
ios::out | открыть файл для записи |
ios::ate | при открытии переместить указатель в конец файла |
ios::app | открыть файл для записи в конец файла |
ios::trunc | удалить содержимое файла, если он существует |
ios::binary | открытие файла в двоичном режиме |
Режимы открытия файлов можно устанавливать непосредственно при создании объекта или при вызове метода open().
fout.open("file.txt", ios::app);
Режимы открытия файлов можно комбинировать с помощью поразрядной логической операции ИЛИ |, например:
ios::out | ios::in - открытие файла для записи и чтения.
Произвольный доступ к файлу
Система ввода-вывода С++ позволяет осуществлять произвольный доступ с использованием методов seekg() и seekp().
- ifstream &seekg(Смещение, Позиция);
- ofstream &seekp(Смещение, Позиция);
Смещение определяет область значений в пределах файла (long int).
Система ввода-вывода С++ обрабатывает два указателя, ассоциированные с каждым файлом:
- get pointer g - определяет, где именно в файле будет производиться следующая операция ввода;
- put pointer p - определяет, где именно в файле будет производиться следующая операция вывода.
Позиция смещения определяется как
Позиция | Значение |
ios::beg | Начало файла |
ios::cur | Текущее положение |
ios::end | Конец файла |
Всякий раз, когда осуществляются операции ввода или вывода, соответствующий указатель автоматически перемещается.
С помощью методов seekg() и seekp() можно получить доступ к файлу в произвольном месте.
Можно определить текущую позицию файлового указателя, используя следующие функции:
- streampos tellg() - позиция для ввода
- streampos tellp() - позиция для вывода
Пример на С++
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <fstream>
using namespace std;
int main()
{
system("chcp 1251");
system("cls");
char s[80];
fstream inOut;
inOut.open("file.txt", ios::out);
inOut << "строчка текста" << endl;
inOut.seekp(8, ios::beg);
inOut << "еще строчка текста";
inOut.close();
inOut.open("file.txt", ios::in);
inOut.seekg(-6, ios::end);
inOut >> s;
inOut.close();
cout << s;
cin.get();
return 0;
}
В результате выполнения первой части программы будет создан файл
Вторая часть программы выведет в консоль
Ещё один пример. Допустим, нам нужно заполнять таблицу
ФИО | Дата рождения | Хобби |
Причем каждая вновь введенная строка должна размещаться в таблице непосредственно под "шапкой".
Алгоритм решения задачи следующий:
- формируем очередную строку для вывода
- открываем файл для чтения, считываем из него данные и сохраняем их в массив строк
- закрываем файл
- открываем файл для записи
- выводим "шапку" таблицы
- выводим новую строку
- выводим все сохраненные строки обратно в файл, начиная со строки после шапки
Пример на C++
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
#include <fstream>
using namespace std;
#define LINES 100 // максимальное количество строк в файле
int main() {
system("chcp 1251");
system("cls");
char line[LINES][100];
char str[30];
char s[] = "| | | |";
// Ввод данных для размещаемой строки
cout << "ФИО: ";
cin.getline(str, 30); // вводим ФИО
for (int i = 0; str[i] != '\0'; i++) // копируем в строку без 0
s[i + 2] = str[i]; // начиная с указанной позиции
cout << "Дата: ";
cin.getline(str,30);
for (int i = 0; str[i] != '\0'; i++)
s[i + 33] = str[i];
cout << "Хобби: ";
cin.getline(str,30);
for (int i = 0; str[i] != '\0'; i++)
s[i + 50] = str[i];
fstream inOut;
inOut.open("file.txt", ios::in); // открываем файл для ввода
// Считываем из файла имеющиеся данные
int count = 0;
while (inOut.getline(line[count], 100)) count++;
inOut.close(); // закрываем файл
inOut.open("file.txt", ios::out); // открываем файл для вывода
inOut << "--------------------------------------------------------------------------------" << endl;
inOut << "| ФИО | Дата | Хобби |" << endl;
inOut << "--------------------------------------------------------------------------------" << endl;
inOut << s << endl; // выводим сформированную строку
inOut << "--------------------------------------------------------------------------------" << endl;
// Выводим обратно в файл все строки кроме "шапки" (первые 3 строки)
for (int j = 3; j < count; j++)
{
inOut << line[j] << endl;
}
inOut.close();
cin.get();
return 0;
}
Результат выполнения:



Полученный файл данных:
Назад: Язык C++
2
3
4
5
6
if (!test) {
cout << "not found test_file ";
return 0;
while(!test.eof()){ //пока не конец.
....}
2
3
4
5
6
7
8
int nVar;
fsInp.open("data.txt");
while(!fsInp.eof())
{ fsInp >> nVar; // Считали
// Обработали
}
fsInp.close();
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
import java.util.Arrays;
class Combinations
{
private static final int M = 12;
private static final int N = 24;
private static int[] generateCombinations(int[] arr)
{
if (arr == null)
{
arr = new int[M];
for (int i = 0; i < M; i++)
arr[i] = i + 1;
return arr;
}
for (int i = M - 1; i >= 0; i--)
if (arr[i] < N - M + i + 1)
{
arr[i]++;
for (int j = i; j < M - 1; j++)
arr[j + 1] = arr[j] + 1;
return arr;
}
return null;
}
public static void main(String args[])
{
int[] arr = null;
while ((arr = generateCombinations(arr)) != null)
out.println(Arrays.toString(arr));
}
}
2
3
4
5
6
7
8
9
10
11
12
fout.open("file.txt", ios::out);
for (int i = 0; i < SIZE; i++)
{
for (int j = 0; j < SIZE; j++)
printf("%5d ", a[i][j]);
printf("\n");
fout << a[i] << endl;
}
fout.close();
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
#include <iostream>
using namespace std;
#define LINES 100
int main(int argc, char* argv[]) {
system("chcp 1251");
system("cls");
char line[LINES][150];
char str[30];
char s[] = "| | | | ";
cout << "Prizwyshce: ";
cin.getline(str, 30);
for (int i = 0; str[i] != '\0'; i++)
s[i + 0] = str[i];
cout << "Matematyka: ";
cin.getline(str, 30);
for (int i = 0; str[i] != '\0'; i++)
s[i + 33] = str[i];
cout << "Programywannya: ";
cin.getline(str, 30);
for (int i = 0; str[i] != '\0'; i++)
s[i + 61] = str[i];
cout << "Metrologiya: ";
cin.getline(str, 30);
for (int i = 0; str[i] != '\0'; i++)
s[i + 97] = str[i];
ofstream file;
file.open("EXAM.txt", ios::in);
file << "------------------------------------------------------------------------------------------------------------" <<endl;
file << "|Прізвище |Вища мат.|Програмування|Метрол.|"<<endl;
file << "------------------------------------------------------------------------------------------------------------" << endl;
file << s << endl;
for (int j = 3; j<count; j++)
{
file << line[j] << endl;
}
file.close();
cin.get();
return 0;
}
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
51
52
53
54
55
#include <cstdlib>
#include <fstream>
#include <iomanip>
#include <cmath>
#include <string>
using namespace std;
void FuncA()
{
cout << "Данные записаны" << endl << endl;
}
void FuncB()
{
cout << "Функция 2";
}
void FuncC()
{
cout << "Функция 3";
}
int main()
{
setlocale(0, "");
cout << "Введите название файла" << endl;
char filename[40];
cin.getline(filename, 40);
ofstream File (filename);
File << ".";
cout << "Файл создан!" << endl;
File.close();
ifstream fin (filename);
if (!fin.is_open())
{
cout << "Файл не может быть открыт!" << endl;
}
else
{
cout << "Файл открыт" << endl;
}
cout << "Выберите операцию: " << endl;
int cmd = -1;
do
{
if (cmd == 1)
FuncA();
else if (cmd == 2)
FuncB();
else if (cmd == 3)
FuncC();
cout << "1-Вывод размера типов данных\n2-Рассчёт фрактала\n3-Рассчёт активности по цефепиму и L-аргинину\n0-Выход" << endl;
cin >> cmd;
}
while (cmd);
return 0;
}
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <fstream>
using namespace std;
#define LINES 100
int main() {
system("chcp 1251");
system("cls");
int check = 1;
char line[LINES][100];
char str[41];
char s[] = "| | | | | | | |";
while (check == 1) {
cout << "Имя : ";
cin.getline(str, 20);
for (int i = 0; str[i] != '\0'; i++)
s[i + 1] = str[i];
cout << "Фамилия : ";
cin.getline(str, 20);
for (int i = 0; str[i] != '\0'; i++)
s[i + 22] = str[i];
cout << "Адрес проживания : ";
cin.getline(str, 40);
for (int i = 0; str[i] != '\0'; i++)
s[i + 43] = str[i];
cout << "Город : ";
cin.getline(str, 20);
for (int i = 0; str[i] != '\0'; i++)
s[i + 84] = str[i];
cout << "Почтовый индекс : ";
cin.getline(str, 20);
for (int i = 0; str[i] != '\0'; i++)
s[i + 105] = str[i];
cout << "Номер телефона : ";
cin.getline(str, 20);
for (int i = 0; str[i] != '\0'; i++)
s[i + 126] = str[i];
cout << "Адрес эл. почты : ";
cin.getline(str, 25);
for (int i = 0; str[i] != '\0'; i++)
s[i + 147] = str[i];
fstream abonent;
abonent.open("file.txt", ios::in);
int count = 0;
while (abonent.getline(line[count], 100)) count++;
abonent.close();
abonent.open("file.txt", ios::app);
abonent.seekg(0, ios::end);
if (abonent.tellg() == 0) {
abonent << "-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------" << endl;
abonent << "| Имя | Фамилия | Адрес проживания | Город | Почтовый индекс | Номер телефона | Адрес эл. почты |" << endl;
abonent << "-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------" << endl;
}
abonent << s << endl;
abonent << "-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------" << endl;
abonent.close();
cout << "Продолжить? ";
cin >> check;
}
cin.get();
return 0;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using namespace std;
int main()
{
string buf;
ifstream infile;
infile.open("text.txt", ios::in);
if(infile.is_open()){
infile >> buf;
short n = strlen(buf);
short k=0;
if(n%2) {
k = n/2;
cout << buf[k];
}
else cout << buf[k] << " " << buf[k+1];
}
else{
cout << "File error."<< endl;
return 1;
}
infile.close();
return 0;
}
2
3
4
5
6
7
textoutbuf.push_back('\n');
//m_sock.fileLog << "yjjfhjshdsjhf dkcfjdhj jfcjh 111111";
m_sock.fileLog << textoutbuf;
INT qqq = GetLastError();
m_sock.fileLog.flush();//очистить поток
m_sock.fileLog.close();
2
3
4
5
6
7
8
9
10
11
12
13
using namespace std;
int main()
{
ofstream m_sock;
m_sock.open("C://1/file.txt");
char textoutbuf[] = "yjjfhjshdsjhf dkcfjdhj jfcjh 111111\n";
m_sock << textoutbuf;
m_sock << "yjjfhjshdsjhf dkcfjdhj jfcjh 111111";
m_sock.flush();
m_sock.close();
return 0;
}
2
3
4
5
cout >> "filename: ";
cin << filename;
inOut.open(filename, ios::in);
...
for(int i=0; i<100; i++) cout<<line[4][100]; Тоже не работает
2
cout << line[3];
Если данные из файла считываются, то они не удаляются. Удаление данных происходит только при открытии файла в режиме записи (строка 32 последнего примера в статье).
2
3
for(i=0; i<4; i++) inOut.getline(line[i], 100);
inOut.getline(line[i], 100); // вот Ваша 4-ая строка