c++读写二进制模式
C++ reading/writing binary mode
我正在学校学习c++,在我看来它是一门美丽的语言,但是我有这个恼人的问题。课本上用FILE *text
, scanf
和printf
来表示,我个人不喜欢这样;我习惯了cin
和cout
,或者<<
, >>
,最好是fstream
。
我的问题是:
-
我必须制作一个以二进制模式写入数据的应用程序(我已经完成了一半,但由于某种原因它不以二进制模式写入)
-
在我写下城市(或城市)的坐标(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。有问想要一种方法来做搜索(和更新)二进制文件,我提出了一个简单的方法来实现相同的。
相关文章:
- C++二进制模式下写入和读取文件
- 二进制模式 + 格式化文本操作或文本模式 + 二进制数据操作 - 有意义吗?
- 我无法使用C ++以二进制模式保存数据
- std::ifstream 在二进制模式下,语言环境在 C++ 中
- 如何仅使用 std::filebuf 将数据(二进制模式)写入文件
- ifstream读取二进制文件在发行模式下工作,但在调试模式下不使用
- 浮点字面至IEEE-754二进制图案跨编译器的二元模式一致性
- 我想将CSTRING数据存储到二进制中(不是在文本模式下,而是统一),但无法存储它
- 为什么FWRITE在二进制模式下会慢得多
- 为什么使用char数组来存储以二进制模式打开的文件的内容
- 获取二进制文件的所有可能变体 - 给定一个模式
- 在C 中打开二进制文件,更改打开文件的模式
- C++文件二进制模式副本
- OOPS 设计模式,以避免对大小更改的二进制依赖
- 二进制与文本模式下的文件操作 -- 性能问题
- 使用二进制模式将数据结构写入文件
- 以二进制模式写入文件不起作用
- 如何在二进制模式下将 NULL 写入文件
- 使用本地二进制模式进行对象跟踪:更改检测ROI的大小
- 通过在 C++ 中使用发布模式二进制文件获取崩溃原因