我似乎无法弄清楚为什么我的 read/write 到文件功能不起作用
I can't seem to figure out why my read/write to a file functions are not working
我一直在做我的项目,我需要做的最后一件事是在程序启动时保存并开始从文件中读取结构数组,但我不明白为什么代码是'加载文件的信息。我知道它确实保存了一些东西,因为我可以打开 .dat 文件并在文本编辑器中阅读它。
我为可怕的风格道歉,但我还是新手。这是代码中该函数的示例:
#include <iostream>
#include <string>
#include<fstream>
using namespace std;
struct property {
int num;
char nBrok[50];
char type[10];
string adress;
char outlook[20];
double price;
double size;
int nRooms;
int floor;
int status;
};
fstream fp;
void fileWrite(property bDanni[], int n) {
fp.open("dbase.dat", ios::binary | ios::out);
if (!fp) {
cout << "\n Error in file \n"; exit(1);
}
fp.write((char*)bDanni, sizeof(property) *n);
fp.close();
}
int fileRead(property bDanni[]) {
long pos; int n = 0, i; property b;
fp.open("dbase.dat", ios::binary | ios::in);
if (!fp) {
cout << "\n file does not exist\n"; return n;
}
fp.seekg(0l, ios::end);
pos = fp.tellg();
fp.close();
n = pos / (sizeof(property));
fp.open("dbase.dat", ios::binary | ios::in);
if (!fp) {
cout << "\n Error in file \n"; exit(1);
}
for (i = 0; i < n; i++) {
fp.read((char*)&b, sizeof(property));
bDanni[i] = b;
}
fp.close();
return n;
}
int main() {
property bDanni[100];
char answer;
int total = 0;
cout << "Do you wat to read from the save file?(y/n): ";
cin >> answer;
if (answer == 'y') {
int total = fileRead(bDanni);
}
}
问题是 C++ std::string
比 char 数组复杂得多。该实现不是标准强制要求的,但在常见的实现中,string
元素包含一个指向字符数组的指针。这意味着您的代码仅将指针值而不是字符串存储到文件中。
在 C++ 惯用语中,std::string
类型被称为不可 平凡可复制的 。并且 fread
-fwrite
方法只能用于普通可复制类型。
这意味着您将不得不使用 序列化 将 std::string
的原始字节表示替换为表示 的字节序列对象的有用内容,您可以在阅读时使用这些内容来构造对象。不是很复杂,但不仅仅是 fwrite
.
我一直在做我的项目,我需要做的最后一件事是在程序启动时保存并开始从文件中读取结构数组,但我不明白为什么代码是'加载文件的信息。我知道它确实保存了一些东西,因为我可以打开 .dat 文件并在文本编辑器中阅读它。 我为可怕的风格道歉,但我还是新手。这是代码中该函数的示例:
#include <iostream>
#include <string>
#include<fstream>
using namespace std;
struct property {
int num;
char nBrok[50];
char type[10];
string adress;
char outlook[20];
double price;
double size;
int nRooms;
int floor;
int status;
};
fstream fp;
void fileWrite(property bDanni[], int n) {
fp.open("dbase.dat", ios::binary | ios::out);
if (!fp) {
cout << "\n Error in file \n"; exit(1);
}
fp.write((char*)bDanni, sizeof(property) *n);
fp.close();
}
int fileRead(property bDanni[]) {
long pos; int n = 0, i; property b;
fp.open("dbase.dat", ios::binary | ios::in);
if (!fp) {
cout << "\n file does not exist\n"; return n;
}
fp.seekg(0l, ios::end);
pos = fp.tellg();
fp.close();
n = pos / (sizeof(property));
fp.open("dbase.dat", ios::binary | ios::in);
if (!fp) {
cout << "\n Error in file \n"; exit(1);
}
for (i = 0; i < n; i++) {
fp.read((char*)&b, sizeof(property));
bDanni[i] = b;
}
fp.close();
return n;
}
int main() {
property bDanni[100];
char answer;
int total = 0;
cout << "Do you wat to read from the save file?(y/n): ";
cin >> answer;
if (answer == 'y') {
int total = fileRead(bDanni);
}
}
问题是 C++ std::string
比 char 数组复杂得多。该实现不是标准强制要求的,但在常见的实现中,string
元素包含一个指向字符数组的指针。这意味着您的代码仅将指针值而不是字符串存储到文件中。
在 C++ 惯用语中,std::string
类型被称为不可 平凡可复制的 。并且 fread
-fwrite
方法只能用于普通可复制类型。
这意味着您将不得不使用 序列化 将 std::string
的原始字节表示替换为表示 的字节序列对象的有用内容,您可以在阅读时使用这些内容来构造对象。不是很复杂,但不仅仅是 fwrite
.