struct — C ++ чтение / запись в двоичном режиме

Я изучаю C ++ в школе и, на мой взгляд, это прекрасный язык, но у меня есть эта досадная проблема. В учебнике написано с FILE *text а также scanf а также printfи мне лично это не нравится; я привык cin а также cout или с << >> лучше сказать с fstream,

Итак, вот моя проблема:

  1. Я должен сделать приложение, которое записывает данные в двоичном режиме (я сделал это на половине, но по какой-то причине оно не записывает в двоичном режиме)

  2. После того, как я напишу городу (orasul) координаты (x и y), я должен найти их и получить эти значения. (Здесь я пытался использовать string.find) но я должен использовать seekg искать в «двоичном режиме» и получать эти значения отдельно в структуре.

Если вы, ребята, можете как-то наставить меня, потому что я довольно запутался здесь. И есть ли способ, которым я могу получить sizeof(struct) ?

#include <iostream>
#include <conio.h>
#include <fstream>
#include <string>
#include <limits>

using namespace std;

struct oras {
std::string orasul;
int x;
int y;
} ora;void functiaPrincipala();
void calculator(float coordonate_x1, float coordonate_y1, float coordonate_x2, float coordonate_y2);
void adaugaOras();
void stergeLocatie();
void repetare();

void main() {
functiaPrincipala();
}

void functiaPrincipala() {
// variabile
int obtiune;
// ofstream fisierOut;
// ifstream fisierIn;cout << "1) Adauga localitate: " << endl;
cout << "2) Stergerea unei localitati existente: " << endl;
cout << "3) Stergerea tuturor localitatilor existente: " << endl;
cout << "4) Afisarea tuturor localitatilor existente: " << endl;
cout << "5) Calculul distantei a doua localitati: " << endl;
cout << "Introduceti obtiunea: " << endl;
cin >> obtiune;

switch (obtiune) {
case 1:
adaugaOras();
break;
case 2:
stergeLocatie();
break;
case 3:
break;
case 4:
break;
case 5:
break;
}

getch();
}

void calculator(float coordonate_x1, float coordonate_y1, float coordonate_x2, float coordonate_y2) {
float rezultat;rezultat = sqrt((coordonate_x2 * coordonate_x1) - (coordonate_x2 * coordonate_x1) + (coordonate_y2 * coordonate_y1) - (coordonate_y2 * coordonate_y1));

cout << "Distanta de la orasul 1 la orasul 2 este de: " << rezultat;

}

void adaugaOras() {
int n;
ofstream fisierOutt("textttt.txt", ios::app | ios::binary);

//  fisierOutt.open("textttt.txt");
cout << "Cate orase doresti sa introduci: ";
cin >> n;
if (fisierOutt.is_open()) {

for (int i = 0; i < n; i++) {
cout << "Introdu numele orasului: ";
cin >> ora.orasul;
cout << "Introdu coordonatele x: ";
cin >> ora.x;
cout << "Introdu coordonatele y: ";
cin >> ora.y;
fisierOutt << ora.orasul << " " << ora.x << " " << ora.y << endl;
cout << endl << endl;}

} else {
cout << "Nu am putut deschide fisierul";
}
fisierOutt.close();
cout << endl;
// repetare();
}

void stergeLocatie() {

}

void repetare() {
char obtiune;
cout << "Doriti sa mai adaugati ceva sau sa iesiti?(d/n)";
cin >> obtiune;
if (obtiune == 'd') {
functiaPrincipala();
} else {
exit;
}
}

2

Решение

Как я уже сказал в своем комментарии, вы не можете искать конкретную запись, поскольку все записи имеют разные размеры.

Это может быть решено с помощью отдельного индексного файла, где каждая запись индекса содержит позицию записи в реальном файле. Таким образом, когда вам нужна запись X, вы сначала ищите в файле индекса правильную позицию, читаете позицию, а затем используете ее для поиска в реальном файле данных.

Это сколько DBM менеджеры баз данных обрабатывают свои данные.

Записи в индексном файле должны иметь фиксированный размер, например, каждая запись в индексе имеет тип std::ostream::pos_typeи вы используете write написать индекс и read читать это.

1

Другие решения

Проверьте https://stackoverflow.com/a/15452958/2156678 . Там asker хотел найти (и обновить) двоичный файл, и я предложил простой способ добиться того же.

0

По вопросам рекламы [email protected]