我在学校学习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;
}
}
答案 0 :(得分:1)
就像我在评论中所说,你不能真正寻求特定的条目,因为所有条目都有不同的大小。
可以通过使用单独的索引文件来解决,其中每个索引条目包含真实文件中条目的位置。这样,当你需要输入X时,你首先在索引文件中寻找正确的位置,读取位置,然后用它来寻找真实的数据文件。
这是有多少DBM个数据库管理员处理他们的数据。
索引文件中的条目必须是固定大小,例如索引中的每个条目都是std::ostream::pos_type
类型,并使用write
来编写索引,{{3}阅读它。
答案 1 :(得分:0)
检查https://stackoverflow.com/a/15452958/2156678。提问者想要一种方法来对二进制文件进行搜索(和更新),我提出了一种实现相同目的的简单方法。