C++ 不接受对象字符串中的@符号吗?似乎是地址问题?
C++ Won't Accept @ symbol in object string? Seems to be address issue maybe?
我迷路了。当保存和加载数据到二进制文件时,我遇到了以下代码的问题。我有一个非常相似/确切的代码片段,与不同的对象工作。我认为这与电子邮件地址和其中的@符号有关。以下是重要的功能。
/* This is my save to file function */
FILE *file=fopen("patronsave","wb");
fwrite(&buffer,sizeof(buffer),1,file);
for(int i=0;i<3;i++){
Patron_Class *ppointer = new Patron_Class();
cout << "n" << endl;
ppointer->save(file);
}
fclose(file);
这是我用来将对象保存到文件中的函数。
下面是我用来加载文件的代码:
vector<Patron_Class*> Patron_Entries;
FILE *file=fopen("patronsave","rb");
fread(&buffer,sizeof(buffer),1,file);
printf("Buffer: %dn",buffer);
for(int i=0;i<buffer;i++){
Patron_Class *pointer2 =new Patron_Class(file);
Patron_Entries.push_back(pointer2);
Patron_Entries[i] -> print();
system("pause");
}
fclose(file);
如果我运行保存函数,然后立即运行加载函数,它可以工作,但如果我只运行加载函数,它在试图加载电子邮件时崩溃。下面是我的类和对象代码:
class Patron_Class{
public:
long patron_id;
string F_name;
string L_name;
long phone_num;
string email;
string street_address;
string city;
string state;
int zip_code;
Patron_Class(){
cout << "Please enter a new ID" << endl;
cin >> patron_id;
cin.ignore(1000, 'n');
system("cls");
cout << "Please enter a First name" << endl;
cin >> F_name;
cin.ignore(1000, 'n');
system("cls");
cout << "Please enter a last name" << endl;
cin >> L_name;
cin.ignore(1000, 'n');
system("cls");
cout << "Please enter a phone number" << endl;
cin >> phone_num;
cin.ignore(1000, 'n');
system("cls");
cout << "Please enter a email" << endl;
cin >> email;
cin.ignore(1000, 'n');
system("cls");
cout << "Please enter a street address" << endl;
cin >> street_address;
cin.ignore(1000, 'n');
system("cls");
cout << "Please enter a city" << endl;
cin >> city;
cin.ignore(1000, 'n');
system("cls");
cout << "Please enter a State via it's initials" << endl;
cin >> state;
cin.ignore(1000, 'n');
system("cls");
cout << "Please enter a zip code" << endl;
cin >> zip_code;
cin.ignore(1000, 'n');
system("cls");
cout << "You have created a new patron named: " << F_name << " " << L_name << endl;
}
Patron_Class(FILE *inputfile){
fread(&patron_id, sizeof(patron_id),1,inputfile);
fread(&F_name, sizeof(F_name),1,inputfile);
fread(&L_name, sizeof(L_name),1,inputfile);
fread(&phone_num, sizeof(phone_num),1,inputfile);
fread(&email, sizeof(email),1,inputfile);
fread(&street_address, sizeof(street_address),1,inputfile);
fread(&city, sizeof(city),1,inputfile);
fread(&state, sizeof(state),1,inputfile);
fread(&zip_code, sizeof(zip_code),1,inputfile);
}
void print(){
cout << patron_id << " " << F_name << " " << L_name << " " << phone_num << " " << email << " " << street_address << " " << city << " " << state << " " << zip_code << "n" << endl;
}
void save(FILE *inputFile){
fwrite(&patron_id, sizeof(patron_id),1,inputFile);
fwrite(&F_name, sizeof(F_name),1,inputFile);
fwrite(&L_name, sizeof(L_name),1,inputFile);
fwrite(&phone_num, sizeof(phone_num),1,inputFile);
fwrite(&email, sizeof(email),1,inputFile);
fwrite(&street_address, sizeof(street_address),1,inputFile);
fwrite(&city, sizeof(city),1,inputFile);
fwrite(&state, sizeof(state),1,inputFile);
fwrite(&zip_code, sizeof(zip_code),1,inputFile);
}
};
有人知道为什么它可能会崩溃吗?
这显然是错误的:
string F_name;
...
fread(&F_name, sizeof(F_name),1,inputfile);
...
fwrite(&F_name, sizeof(F_name),1,inputFile);
[同样适用于您的PatronClass
中的所有其他字符串-我在此示例中使用第一个]
类std::string
看起来像这样(为了说明目的,确切的实现涉及几个层,一些模板和其他东西,所以为了后面的解释目的,这是简化的):
class string
{
char *str;
int len;
public:
...
};
因此,当您从文件中执行fread
并fwrite到文件时,您正在从文件中读取/写入char *str;
和int len;
成员。
假设我们从头开始程序,文件中没有数据,我们使用Patron_Class()
构造函数。因此,我们读取id,然后从控制台读取F_name
。假设输入Charles
。因此,string
类将以某种方式分配8字节的内存,地址为0x600018。因此,string::str == 0x600018
和len = 8
-在堆中的位置6000018是字母C h a r l e s
[空格只是为了说明它们在不同的内存位置]。现在我们将其保存到一个文件中。因此该文件包含00600018 00000008
。现在我们停止程序并使用PatronClass(file)
构造函数重新启动它。堆是完全空的。我们加载文件数据,所以是string::str = 0x600018
和len = 8
,但是这个位置0x600018不包含C h a r l e s
,而是堆初始化时通常归档的位置[很可能是0]。难怪你的名字没出现。
现在,实际程序的确切行为可能与我上面描述的不一样,但它不会正常工作。不可能,永远不可能。无论你的名字、电子邮件地址或代码中的任何其他字符串中有或没有什么字符。它看起来可以工作的唯一原因是数据大部分仍然在堆中,并且它看起来正在工作,因为在您的情况下它没有被其他东西覆盖。
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- 工会成员的析构函数似乎是自动调用的
- 对GLFW / Vulkan的未定义引用,尽管库似乎是链接的
- 为什么当我尝试打印地图内容时,我得到的是地址而不是 C++ 中的值?
- 为什么 C++ 中的字符数组返回其项目而不是地址?
- C 程序如果功能中的语句不执行.在逻辑上似乎是错误的
- C++:为什么最后一个输出不是地址以及如何获取值 9
- C++ Visual 工作室中的逻辑错误.阵列打印的是地址而不是内容
- 为什么没有参数的构造函数似乎是此代码的问题
- 当值是地址C 时,如何使用键使用映射值
- 是静态分配的数组的内存分配始终是地址值的顺序
- 立方体的正态似乎是向内指向
- 对于特定情况的整数溢出似乎是由整数溢出引起的错误
- 在Stdout上似乎是僵局
- 这个逻辑似乎是正确的,但它不起作用.有没有错
- 有没有更好的方法可以使此代码线程安全?线程局部静态似乎是一个生硬的工具
- Travis CI似乎是从错误的Stdlib读书
- 什么是地址0xbaddc0dedeadbead "Bad decode dead bead"
- 为什么我们必须在C++中将值而不是地址传递到"call by reference"函数中?
- C++ 不接受对象字符串中的@符号吗?似乎是地址问题?