c++读写二进制模式

C++ reading/writing binary mode

本文关键字:模式 二进制 读写 c++      更新时间:2023-10-16

我正在学校学习c++,在我看来它是一门美丽的语言,但是我有这个恼人的问题。课本上用FILE *text, scanfprintf来表示,我个人不喜欢这样;我习惯了cincout,或者<<, >>,最好是fstream

我的问题是:

  1. 我必须制作一个以二进制模式写入数据的应用程序(我已经完成了一半,但由于某种原因它不以二进制模式写入)

  2. 在我写下城市(或城市)的坐标(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。有问想要一种方法来做搜索(和更新)二进制文件,我提出了一个简单的方法来实现相同的。