2

私は学校で C++ を学んでいます。私の意見では、C++ は美しい言語ですが、この厄介な問題があります。教科書ではFILE *textandscanfと と書いてありprintfますが、個人的には好きではありません。私は慣れてきましたcinそしてcoutまたは で<< >> より良い言い方をし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;
    }
}
4

2 に答える 2

1

コメントで述べたように、すべてのエントリのサイズが異なるため、特定のエントリを実際に探すことはできません。

これは、個別のインデックス ファイルを用意することで解決できます。各インデックス エントリには、実際のファイル内のエントリの位置が含まれます。このように、エントリ X が必要な場合、最初にインデックス ファイルを正しい位置までシークし、その位置を読み取り、それを使用して実際のデータ ファイルをシークします。

これは、データを処理するDBMデータベース マネージャーの数です。

インデックス ファイル内のエントリは固定サイズである必要があります。たとえば、インデックス内の各エントリのタイプは であり、インデックスの書き込みと読み取りにstd::ostream::pos_type使用します。writeread

于 2013-03-17T11:00:25.303 に答える
0

https://stackoverflow.com/a/15452958/2156678を確認してください。質問者は、バイナリ ファイルを検索 (および更新) する方法を求めていました。私は、同じことを実現する簡単な方法を提案しました。

于 2013-03-17T14:18:31.283 に答える