【发布时间】:2013-03-17 09:57:45
【问题描述】:
我在学校学习 C++,在我看来它是一门漂亮的语言,但我遇到了这个烦人的问题。课本上写的是FILE *textscanfprintf,个人不太喜欢;我习惯了cin 和cout 或<< >> 更好地使用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;
}
}
【问题讨论】:
-
您不能轻易找到特定的条目,因为这些条目的大小是可变的。如果文件中的所有条目都具有固定大小,那将很容易。
-
"P.S 有没有一种方法可以让我更轻松地输入代码,然后按空格键四次?"是的,只需将其粘贴进去,选择它,然后单击
{}按钮。 -
非常感谢您的帮助。老师告诉我有一种方法可以让我得到结构体的大小(sizeof(ora),然后我用 seekg 找到它......但问题是我不会写它
-
首先你不应该在二进制模式下写空格(这是没用的,你必须在阅读时考虑它们)。其次,您应该先写字符串的大小,然后再写字符串。这是必需的,因为字符串具有可变长度,当您读回它们时,您应该知道何时停止以及 x、y 何时开始(具有恒定长度)。 Si salutari de la un concetatian :D
-
您无法将结构写入磁盘,因为它包含
std::string。要么在写入之前必须将其 marshall 到另一个结构,要么将字符串存储为固定大小的char数组。