2013-03-17 84 views
2

我在學校學習C++,在我看來這是一種美麗的語言,但我有這個煩人的問題。在文本書中,它的編寫方式是FILE *textscanfprintf,我個人不喜歡它;我習慣了cincout或與<<>>更好地說與fstreamC++讀寫二進制模式

因此,這裏是我的問題:

  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; 
    } 
} 
+0

由於條目大小可變,因此您無法輕鬆查找特定條目。如果文件中的所有條目具有固定大小,則很容易。 – 2013-03-17 10:03:56

+3

「P.S有沒有辦法讓我輸入代碼更容易,然後按空格四次?」是的,只需粘貼它,選擇它,然後單擊「{}」按鈕。 – Thomas 2013-03-17 10:09:07

+0

非常感謝您的幫助。老師告訴我,有一種方法,我得到的結構(sizeof(ora)的大小,之後,我使用seekg找到它...但問題是我不能寫它 – 2013-03-17 10:54:56

回答

1

就像我在我的評論中說的,你不能真正尋求一個具體的條目,因爲所有條目都是不同的大小。

它可以通過一個單獨的索引文件解決,其中每個索引條目包含實際文件中條目的位置。這樣,當您需要輸入X時,您首先在索引文件中查找正確的位置,讀取位置,然後使用它來查找實際的數據文件。

這是多少個DBM數據庫管理器處理其數據。

在索引文件中的條目必須是固定的大小,例如在指數中的每個條目是std::ostream::pos_type型,並使用write寫的指數,並read讀它。

+0

是的,我明白這一點,但我想要做的是當我尋找一個城市時,我得到了t他的座標爲x和y的那座城市的規模,我可以說50個字節。我用這個文件搜索那些50字節的文件(我猜想),當有一個匹配的時候返回這些值: - ? – 2013-03-17 11:27:00

+0

另一種方法是創建一個文件頭。首先發帖子,然後張貼地址,然後所有的帖子。首先閱讀標題,找到要找的地方和多少,然後閱讀。 – dutt 2013-03-17 11:58:23

+0

或者我沒有辦法與fstream和fseek合作?我的意思是更快的方式到達當前線路而不用每條線路?我知道這是與fseek或seekg,但我不知道如何exacly – 2013-03-17 15:38:41

0

檢查https://stackoverflow.com/a/15452958/2156678。提供者想要一種方式來搜索(和更新)二進制文件,我提出了一種簡單的方法來實現這一點。

+0

謝謝,我查了一下,但由於某種原因,我無法訪問或使用BinaryFile做什麼,有沒有我應該包含的文件? :-S – 2013-03-18 22:11:58

+0

asker引用的普通香草輸出流(所以我使用了相同的名稱):ofstream BinaryFile(「file_name」,ios :: binary); – Amit 2013-03-19 06:28:28