簡體   English   中英

C ++讀寫二進制模式

[英]C++ reading/writing binary mode

我在學校學習C ++,我認為這是一門漂亮的語言,但是我有這個煩人的問題。 在教科書中,它是用FILE *textscanfprintf編寫的,我個人不喜歡它。 我習慣了cincout或者習慣了fstream<< >>

所以這是我的問題:

  1. 我必須創建一個以二進制模式寫入數據的應用程序(我已經完成了一半的處理,但是由於某種原因它沒有以二進制模式寫入)

  2. 在寫完城市(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 問問者想要一種對二進制文件進行搜索(和更新)的方法,我提出了一種簡單的方法來實現這一目標。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM