2013-03-17 88 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