Я изучаю C ++ в школе и, на мой взгляд, это прекрасный язык, но у меня есть эта досадная проблема. В учебнике написано с FILE *text
а также scanf
а также printf
и мне лично это не нравится; я привык cin
а также cout
или с <<
>>
лучше сказать с fstream
,
Итак, вот моя проблема:
Я должен сделать приложение, которое записывает данные в двоичном режиме (я сделал это на половине, но по какой-то причине оно не записывает в двоичном режиме)
После того, как я напишу городу (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;
}
}
Как я уже сказал в своем комментарии, вы не можете искать конкретную запись, поскольку все записи имеют разные размеры.
Это может быть решено с помощью отдельного индексного файла, где каждая запись индекса содержит позицию записи в реальном файле. Таким образом, когда вам нужна запись X, вы сначала ищите в файле индекса правильную позицию, читаете позицию, а затем используете ее для поиска в реальном файле данных.
Это сколько DBM менеджеры баз данных обрабатывают свои данные.
Записи в индексном файле должны иметь фиксированный размер, например, каждая запись в индексе имеет тип std::ostream::pos_type
и вы используете write
написать индекс и read
читать это.
Проверьте https://stackoverflow.com/a/15452958/2156678 . Там asker хотел найти (и обновить) двоичный файл, и я предложил простой способ добиться того же.