Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
2 / 2 / 0
Регистрация: 19.11.2020
Сообщений: 45

В новый бинарный файл записать первые 3 строки и последние 2

18.03.2021, 17:08. Показов 4387. Ответов 12

Студворк — интернет-сервис помощи студентам
Здравствуйте, выпало задание поработать с вводом и выводом в бинарный файл методами С++. Под видом входных данных есть инициализированная структура на 9 элементов, мне необходимо записать эти 9 элементов в бинарный файл, а затем перенести в новый файл первые три и последние две строки из готового файла. До этого никогда не работал с бинарными файлами и, возможно, вообще не правильно это делаю.

Краткое формулирование задания: Вписать в бинарный файл структуру из 9 элементов, затем из этого файла в новый файл записать первые 3 строки и последние 2

Буду благодарен, если объсните, как работать с бинарными файлами и доставать определенную строку из файла
C++
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
#include "iostream"
#include "fstream"
#include <string>
using namespace std;
struct timeOfFlight {
    int hours;
    int minutes;
};
 
struct flight {
    int numberOfRace;
    string type;
    timeOfFlight time;
};
 
int main() {
 
    flight flight[] = {{105,  "Грузовой",     1,  50},
                       {321,  "Пассажирский", 8,  8},
                       {32,   "Грузовой",     15, 6},
                       {2145, "Пассажирский", 20, 44},
                       {123,  "Грузовой",     11, 14},
                       {543,  "Пассажирский", 3,  10},
                       {657,  "Грузовой",     5,  30},
                       {126,  "Пассажирский", 7,  15},
                       {135,  "Грузовой",     8,  40},};
 
    ofstream fin;
    fin.open("C:\\new.txt", ios_base::binary);
    for (int i = 0; i < 9; ++i) {
        fin << "Номер рейса: " << flight[i].numberOfRace << " Тип самолета: " << flight[i].type << " Время полета: " << flight[i].time.hours
        << " часов " << flight[i].time.minutes << " минут" << endl;
    }
    fin.close();
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.03.2021, 17:08
Ответы с готовыми решениями:

Найти в файле строки, где первые 3 слова одинаковы, и записать эти строки без первых 2-х слов в новый файл
Доброго времени суток! Полное задание. Сценарий проверяет в текстовом файле: одинаковы ли первое, второе и третье слово строки, и...

Дан бинарный файл F, с помощью цикла записать его содержимое в новый файл g наоборот
Дан бинарный файл F, с помощью цикла записать его содержимое в новый файл g наоборот

Записать в новый файл первые N слов исходного файла
Открыть файл, имя которого задается с клавиатуры. Записать в другой файл первые n слов этого файла, где n задается с клавиатуры (проверьте,...

12
 Аватар для Annemesski
2674 / 1336 / 480
Регистрация: 08.11.2016
Сообщений: 3,692
18.03.2021, 18:13
Dsyder, о каких строках идет речь? В бинарных файлах нет никаких строк
0
2 / 2 / 0
Регистрация: 19.11.2020
Сообщений: 45
18.03.2021, 19:27  [ТС]
Цитата Сообщение от Annemesski Посмотреть сообщение
Dsyder, о каких строках идет речь? В бинарных файлах нет никаких строк
Значит ошибся на самом начальном уровне, по моей логике (неверной), я заношу структуру в бинарный файл и должен перенести с этого файла первые три и последние два значения в новый файл, но я не имею представления что сначала сделать

Добавлено через 1 час 2 минуты
Немного изучил материал, вроде как освоил вывод структуры в бинарный файл, но как содержание файла переписать в другой файл. И еще, при открытии в notepade вижу много NULL, что не так?

Вот текущий код:
C++
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
#include "iostream"
#include "fstream"
#include <string>
using namespace std;
struct timeOfFlight {
    int hours;
    int minutes;
};
 
struct flight {
    int numberOfRace;
    string type;
    timeOfFlight time;
};
 
int main() {
    flight flight[] = {{105,  "Грузовой",     1,  50},
                       {321,  "Пассажирский", 8,  8},
                       {32,   "Грузовой",     15, 6},
                       {2145, "Пассажирский", 20, 44},
                       {123,  "Грузовой",     11, 14},
                       {543,  "Пассажирский", 3,  10},
                       {657,  "Грузовой",     5,  30},
                       {126,  "Пассажирский", 7,  15},
                       {135,  "Грузовой",     8,  40},};
 
    ofstream fin;
    fin.open("C:\\new.txt", ios_base::binary);
    for (int i = 0; i < 9; ++i) {
        fin.write ((char *) & flight[i], sizeof (flight));
    }
    fin.close();
}
0
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,100
18.03.2021, 19:35
Цитата Сообщение от Dsyder Посмотреть сообщение
sizeof (*flight)
ошибочка с размером

Добавлено через 1 минуту
или уж тогда так

C++
1
2
3
4
5
....
    ofstream fin("C:\\new.txt", ios_base::binary);
    fin.write ((char *)flight, sizeof (flight));
    fin.close();
....
Добавлено через 1 минуту
но всё это всё равно не будет работать ))

Цитата Сообщение от Dsyder Посмотреть сообщение
struct flight {
    int numberOfRace;
    string type;
    timeOfFlight time;
};
0
 Аватар для Annemesski
2674 / 1336 / 480
Регистрация: 08.11.2016
Сообщений: 3,692
18.03.2021, 19:40
Dsyder, первое что нужно понять - это то, что в бинарном файле данные лежат ворохом байт, потому чтобы после записи данных можно было их корректно прочитать нужно продумать формат хранения данных в бинарном файле, у Вас задача дополнительно осложнена тем, что в Вашей структуре присутствует поле переменной длинны типа string, то есть размеры структур будут не одинаковыми, хотя это поле string flight::type содержит тип рейса их можно определить заранее например типом char: символ 'p' - passenger (пассажирский), 'c' - cargo (грузовой) - а в программе уже интерпретировать по необходимости. Тогда структура приобретет вид
C++
1
2
3
4
5
6
7
struct flight {
    int numberOfRace;
    char type;
    timeOfFlight departureTime; // time - имя функции 
//определенной в стандартном заголовке ctime
//лучше избегать таких имен в коде
};
теперь для любого набора данных в структуре категорически всегда будет отводиться sizeof(flight) байт для хранения, то есть записывая данные в файл можете просто шлепать их подряд, только пояснения в этом духе
C++
1
2
3
4
for (int i = 0; i < 9; ++i) {
        fin << "Номер рейса: " << flight[i].numberOfRace << " Тип самолета: " << flight[i].type << " Время полета: " << flight[i].time.hours
        << " часов " << flight[i].time.minutes << " минут" << endl;
    }
делать не надо, нечего всем этим "Время полета: ", "Тип самолета" и прочим делать в файле (особенно в бинарном) просто:
C++
1
2
3
4
5
6
for (int i = 0; i < 9; ++i) {
    fin << flight[i].numberOfRace
        << flight[i].type
        << flight[i].time.hours
        << flight[i].time.minutes;
}
Читать из записанного таким образом файла нужно точно также, в том же порядке полей как записывали.

Также легко будет узнать сколько структур записано в файле, для этого всего-то нужно переместить указатель чтения файла в конец и разделить позицию указателя на sizeof(flight), а чтобы перейти в файле к структуре под номером n нужно переместить указатель чтения файла на позицию n * sizeof(flight). В общем, думаю, идея понятна.
1
2 / 2 / 0
Регистрация: 19.11.2020
Сообщений: 45
18.03.2021, 19:49  [ТС]
Annemesski, спасибо больше, дальше попытаюсь сам вывести нужные элементы в новый файл. Теперь стало ясно, почему говорили не использовать string в структуре, а по поводу уточнений - не моя прихоть
0
 Аватар для Annemesski
2674 / 1336 / 480
Регистрация: 08.11.2016
Сообщений: 3,692
18.03.2021, 20:06
Цитата Сообщение от Dsyder Посмотреть сообщение
а по поводу уточнений - не моя прихоть
врятли Вам дали задание именно писать в файл эти уточнения - это полнейшая чушь. Вам надо эти уточнения печатать при выводе на экран: напишите для структуры функцию print которая будет выводить её в таком виде
C++
1
2
3
4
5
6
void printFlightInfo(const flight &ft)
{
    std::cout << "Номер рейса: " << flight[i].numberOfRace << std::endl
        << "\tтип самолета: " << (flight[i].type == 'p' ? "Пассажирский" : flight[i].type == 'c' ? "Грузовой" : "Неизвестно") << std::endl
        << "\tВремя полета: " << flight[i].time.hours << "ч. " << flight[i].time.minutes << "мин." << std::endl;
}
0
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,100
18.03.2021, 20:17
Цитата Сообщение от Dsyder Посмотреть сообщение
flight flight[] =
советую не использовать имя структуры в качестве идентификаторов. А то выражение sizeof(flight) будет таить сюрпризы. И не только оно
1
2 / 2 / 0
Регистрация: 19.11.2020
Сообщений: 45
18.03.2021, 22:17  [ТС]
Мдам-с, думал сделаю минут за 15, а тут задача затянулась на весь день и до сих пор не могу разобраться. Добавил по совету функцию показа структур с оформлением и убрал весь текст из записи в бинарный файл. В бинарном теперь только инфа структуры по строкам лежит. Вопрос, как дальше их обрабатывать? Можно ли вытащить из бинарного файла строку по индексу? Вот код на данный момент:
C++
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
#include "iostream"
#include "fstream"
#include <string>
using namespace std;
struct timeOfFlight {
    int hours;
    int minutes;
};
 
struct flight {
    int numberOfRace;
    char type[50];
    timeOfFlight departureTime;
};
 
void printDataFromStruct(flight ft[]) {
 
    for (int i = 0; i < 9; ++i) {
        cout << "Номер рейса: " << ft[i].numberOfRace << " Тип самолета: " << ft[i].type << " Время полета: " << ft[i].departureTime.hours
             << " часов " << ft[i].departureTime.minutes << " минут" << endl;
    }
}
 
int main() {
    const int n = 9;
    flight trip[] = {{105, "passanger", 1,  50},
                       {321, "cargo", 8,  8},
                       {32,  "passanger", 15, 6},
                       {215,"cargo", 20, 44},
                       {123, "passanger", 11, 14},
                       {543, "cargo", 3,  10},
                       {657, "passanger", 5,  30},
                       {126, "cargo", 7,  15},
                       {135, "passanger", 8,  40},};
    ofstream fout;
    fout.open("C:\\new.txt", ios_base::binary);
   for (int i = 0; i < 9; ++i) {
        fout << trip[i].numberOfRace
        << trip[i].type
        << trip[i].departureTime.hours
        << trip[i].departureTime.minutes << endl;
    }
    ifstream fin;
    fin.open("C:\\new.txt", ios_base::binary);
    /////
    printDataFromStruct(trip);
}
0
 Аватар для Annemesski
2674 / 1336 / 480
Регистрация: 08.11.2016
Сообщений: 3,692
18.03.2021, 23:16
Лучший ответ Сообщение было отмечено Dsyder как решение

Решение

Функцию вывода лучше написать для вывода одной структуры, тем более что в примере дальше нам понадобится вывести только одну структуру
C++
1
2
3
4
void printDataFromStruct(flight &ft) { // передаем по ссылке чтобы избежать лишнего копирования
        cout << "Номер рейса: " << ft[i].numberOfRace << " Тип самолета: " << ft[i].type << " Время полета: " << ft[i].departureTime.hours
             << " часов " << ft[i].departureTime.minutes << " минут" << endl;
}
Цитата Сообщение от Dsyder Посмотреть сообщение
C++
1
2
3
4
5
struct flight {
 int numberOfRace;
 char type[50];
 timeOfFlight departureTime;
};
ладно, хотите хранить строку, так можно sizeof(flight) постоянен, но вот метод записи теперь не годиться, возвращайтесь к варианту из поста №3
C++
1
2
3
4
5
6
ofstream fout;
fout.open("C:\\new.txt", ios_base::binary);
for (int i = 0; i < 9; ++i) {
    fout.write ((char *) & trip[i], sizeof (flight));
}
fin.close();
Читать соответственно также
C++
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
ifstream fin;
fin.open("C:\\new.txt", ios_base::binary);
 
//определяем количество структур в файле
fin.seekg(0, fin.end); // перемещаем указатель чтения в конец файла
unsigned tripsCount = fin.tellg(); // записываем позицию указателя в переменную, она равна количеству байт в файле
tripsCount /= sizeof(flight); // делим общее количество байт в файле на количество байт занимаемых одной структурой
 
fin.seekg(0, fin.beg); // возвращаем указатель чтения в начало файла
cout << "В файле записано " << tripsCount << " структур типа flight" << endl; // проверочный вывод
 
for (int  i = 0; i < tripsCount; ++i) // вычитываем структуры из файла в массив
    fin.read((char *)&trip[i], sizeof(flight));
 
/* в данном случае можно даже так
этот код можно раскомментировать предварительно закомментировав код
код выше с чтением из файла в цикле
 
fin.read((char *)&trip, sizeof(flight) * tripsCount); // с записью в файл можно поступить также
*/
 
// забираем из файла структуру по номеру
unsigned n;
cout << "Введите номер структуры (нумерация с нуля): ";
cin >> n;
flight flt_n;
fin.seekg(0, fin.beg + n * sizeof(flight)); // перемещаем указатель чтения на структуру с номером n
fin.read((char *)&flt_n, sizeof(flight));
printDataFromStruct(flt_n);
0
2 / 2 / 0
Регистрация: 19.11.2020
Сообщений: 45
19.03.2021, 01:09  [ТС]
Annemesski, спасибо большое, благодаря вашим усилиям получился вот такой код, который необходим по условию задания. Он выводит первые три и последние два элемента структуры из бинарного файла, но еще остался вопрос по поводу этих файлов. Скриншот прикрепляю. Как я понимаю, NULL в бинарном файле появляется из-за неправильной работы с памятью, можете подсказать, где ошибка? И еще небольшой вопрос, можно ли для последнего цикла как-то узнать кол-во элементов в структуре? Вот такой код получился с вашей помощью:
C++
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
51
52
53
54
55
56
57
58
59
60
61
62
#include "iostream"
#include "fstream"
#include <string>
using namespace std;
struct timeOfFlight {
    int hours;
    int minutes;
};
 
struct flight {
    int numberOfRace;
    string type;
    timeOfFlight departureTime;
};
 
void printDataFromStruct(flight &ft) {
        cout << "Номер рейса: " << ft.numberOfRace << " Тип самолета: " << ft.type << " Время полета: " << ft.departureTime.hours
             << " часов " << ft.departureTime.minutes << " минут" << endl;
}
 
int main() {
    flight trip[] = {{105,  "Грузовой",     1,  50},
                       {321,  "Пассажирский", 8,  8},
                       {32,   "Грузовой",     15, 6},
                       {2145, "Пассажирский", 20, 44},
                       {123,  "Грузовой",     11, 14},
                       {543,  "Пассажирский", 3,  10},
                       {657,  "Грузовой",     5,  30},
                       {126,  "Пассажирский", 7,  15},
                       {135,  "Грузовой",     8,  40},};
    ofstream fout;
    fout.open("C:\\new.txt", ios_base::binary);
    for (int i = 0; i < 9; ++i) {
        fout.write ((char *) & trip[i], sizeof (flight));
    }
    fout.close();
    ifstream fin;
    fin.open("C:\\new.txt", ios_base::binary);
 
//определяем количество структур в файле
    fin.seekg(0, fin.end); // перемещаем указатель чтения в конец файла
    unsigned tripsCount = fin.tellg(); // записываем позицию указателя в переменную, она равна количеству байт в файле
    tripsCount /= sizeof(flight); // делим общее количество байт в файле на количество байт занимаемых одной структурой
    fin.seekg(0, fin.beg); // возвращаем указатель чтения в начало файла
    cout << "В файле записано " << tripsCount << " структур типа flight" << endl; // проверочный вывод
 
    for (int  i = 0; i < tripsCount; ++i) // вычитываем структуры из файла в массив
        fin.read((char *)&trip[i], sizeof(flight));
 
// забираем из файла первые три и последние две структуры
    flight flt_n;
    for (int i = 0; i < 3; ++i) {
        fin.seekg(std::ifstream::beg + i * sizeof(flight)); // перемещаем указатель чтения на структуру с номером n
        fin.read((char *)&flt_n, sizeof(flight));
        printDataFromStruct(flt_n);
    }
    for (int j = 8; j > 6; --j) {
        fin.seekg(std::ifstream::beg + j * sizeof(flight)); // перемещаем указатель чтения на структуру с номером n
        fin.read((char *)&flt_n, sizeof(flight));
        printDataFromStruct(flt_n);
    }
}
Миниатюры
В новый бинарный файл записать первые 3 строки и последние 2  
1
 Аватар для Annemesski
2674 / 1336 / 480
Регистрация: 08.11.2016
Сообщений: 3,692
19.03.2021, 08:15
Dsyder, как я уже говорил выше: бинарный файл это ворох байт, допустим есть у Вас число 4095 записанное в переменную типа int, тип int - это 4 байта, а число 4095 в двоичном виде выглядит так (точками отделены байты): 00000000.00000000.00011111.11111111, то есть в памяти компьютера число 4095 представлено как последовательность из четырех байт в которых от младших к старшим записано:
самый младший байт (нулевой): 111111112 = 25510
следующий байт (первый): 000111112 = 3110
второй байт: 000000002 = 010
третий (самый старший байт: 000000002 = 010
в файл пишутся байты этого числа - от младших к старшим, то есть будет такая последовательность 11111111.11111000.00000000.00000000, если теперь открыть файл текстовым редактором, то он попытается интерпретировать эту последовательность байт как последовательность символов с кодами 255 31 0 0 - как редактор их покажет зависит от кодировки, если вы открываете не виндовым блокнотом, а чем-то более серьезным, например notepad++ он покажет что-то вроде [EoM]∆[Nul][Nul] (в квадратных скобках выделены спецсимволы), в шестнадцатеричном виде он покажет: FF 1F 00 00 в общем, повторю еще раз: бинарный файл - это последовательность байт, открывать такие файлы в текстовом редакторе и искать в показанных символах какой-то смысл - бесполезное занятие. Откройте любой другой бинарный файл, например скомпилированный exe-шник этой Вашей программы и Вы увидите похожую картину.

Это я все к чему? Все у Вас в файле нормально - бинарные файлы так и выглядят - никаких ошибок и "неправильной работы с памятью" тут нет.

По поводу количества элементов в структуре не понял что Вы хотите получить. В массиве trip[] у Вас лежат структуры flight в количестве tripsCount, в переменной flt_n одна структура типа flight скопированная из файла по номеру j от начала файла, то есть какая именно структура лежит в flt_n зависит от итерации цикла, а именно от текущего значения счетчика.
1
2 / 2 / 0
Регистрация: 19.11.2020
Сообщений: 45
19.03.2021, 10:05  [ТС]
Annemesski, по поводу бинарного файла - спасибо за разъяснение, очень полезная информация. А по поводу того, что хочу получить - из структуры trip нужно достать первые 3 и последние 2 элемента. Вчера ночью доделывать код и не заметил, что вы написали как узнать кол-во элементов, теперь буду от этого в цикле отталкиваться. По сути - все, огромное еще раз спасибо за помощь в задании
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.03.2021, 10:05
Помогаю со студенческими работами здесь

Суммы первых и последних элементов каждого массива записать в новый бинарный файл
помогите решить задачи на завтрашний экзамен не могу получить допуск, вылетаю со стипендии точнее, коды есть, но ничего не работает ...

Записать в новый бинарный файл F2 все числа файла F1, которые встречаются один раз
Компонентами бинарного файла F1 есть целые числа. Записать в новый бинарный файл F2 все числа файла F1, которые встречаются один раз...

Дан бинарный файл, вывести целые числа из файла и записать числа в новый файл возведя в степень
3. Дан бинарный файл n, вывести целые числа из файла и записать числа в новый файл t возведя в степень.

Записать в новый текстовый файл первые четыре отрицательных элемента исходного и их сумму
Создать файл в который записать не менее 20 целых чисел в диапазоне от -10 до 20. Вывести содержимое файла на экран.Записать в другой...

Текстовый файл состоит из нескольких строк. Записать во второй файл последние символы из каждой строки первого файла
Текстовый файл состоит из нескольких строк. Записать во второй файл последние символы из каждой строки первого файла. === Помогите,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru