我在学校学习C++,我认为这是一门漂亮的语言,但是我有这个烦人的问题。在教科书中,它是用FILE *textscanfprintf编写的,我个人不喜欢它。我习惯了cincout或与<<一起>>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 读取索引。

    10-05 18:16