Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c+中数据文件处理中的分段错误+; 我写了一个C++的小代码,了解数据文件处理。该程序包括接受条目、将条目写入.dat文件以及搜索特定条目。到目前为止,只有写入功能在工作,读取和搜索功能给出了一个分段错误。怎么了 #include<iostream> #include<string> #include<fstream> #include<stdlib.h> using namespace std; class data_base { string name; long int no; public: void input() { cout<<"\nEnter name:"; cin>>name; cout<<"Enter ph number:"; cin>>no; } void display() { cout<<name<<"\t"<<no; } string retname() { return name; } long int retno() { return no; } }; void display_all() { data_base d; fstream in; in.open("database.dat",ios::in|ios::binary); if(!in.is_open()) cout<<"Error opening file"; else{ while(in.read((char *)&d,sizeof(d))) { d.display(); } } in.close(); } void search_name() { data_base d; fstream in; string s; in.open("database.dat",ios::in|ios::binary); if(!in.is_open()) cout<<"Error opening file"; else{ cout<<"\nEnter name to be searched:"; cin>>s; while (in.read((char *) &d,sizeof(d))) { if(s==d.retname()) { d.display(); } } } in.close(); } void search_no() { data_base d; fstream in; long int l; in.open("database.dat",ios::in|ios::binary); if(!in.is_open()) cout<<"Error opening file"; else{ cout<<"\nEnter number to be searched:"; cin>>l; while (in.read((char *) &d,sizeof(d))) { if(l==d.retno()) { d.display(); } } } in.close(); } int main() { int ch; fstream file; data_base d,e; string s; while(1) { cout<<"1.Add entry\n2.Search by name\n3.Search by number\n4.Display all entries\5.Exit"<<endl; cin>>ch; switch (ch) { case 1: d.input(); file.open("database.dat",ios::out|ios::app|ios::binary); if(!file.is_open()) cout<<"Error opening file"; else { file.write((char *)&d,sizeof(d)); cout<<"Entry added!"<<endl; } file.close(); break; case 2:search_name(); break; case 3:search_no(); break; case 4:display_all(); break; case 5: exit(0); } } } #包括 #包括 #包括 #包括 使用名称空间std; 类数据库 { 字符串名; 长int no; 公众: 无效输入() { coutname; 库特诺; } 无效显示() { 库特_C++ - Fatal编程技术网

c+中数据文件处理中的分段错误+; 我写了一个C++的小代码,了解数据文件处理。该程序包括接受条目、将条目写入.dat文件以及搜索特定条目。到目前为止,只有写入功能在工作,读取和搜索功能给出了一个分段错误。怎么了 #include<iostream> #include<string> #include<fstream> #include<stdlib.h> using namespace std; class data_base { string name; long int no; public: void input() { cout<<"\nEnter name:"; cin>>name; cout<<"Enter ph number:"; cin>>no; } void display() { cout<<name<<"\t"<<no; } string retname() { return name; } long int retno() { return no; } }; void display_all() { data_base d; fstream in; in.open("database.dat",ios::in|ios::binary); if(!in.is_open()) cout<<"Error opening file"; else{ while(in.read((char *)&d,sizeof(d))) { d.display(); } } in.close(); } void search_name() { data_base d; fstream in; string s; in.open("database.dat",ios::in|ios::binary); if(!in.is_open()) cout<<"Error opening file"; else{ cout<<"\nEnter name to be searched:"; cin>>s; while (in.read((char *) &d,sizeof(d))) { if(s==d.retname()) { d.display(); } } } in.close(); } void search_no() { data_base d; fstream in; long int l; in.open("database.dat",ios::in|ios::binary); if(!in.is_open()) cout<<"Error opening file"; else{ cout<<"\nEnter number to be searched:"; cin>>l; while (in.read((char *) &d,sizeof(d))) { if(l==d.retno()) { d.display(); } } } in.close(); } int main() { int ch; fstream file; data_base d,e; string s; while(1) { cout<<"1.Add entry\n2.Search by name\n3.Search by number\n4.Display all entries\5.Exit"<<endl; cin>>ch; switch (ch) { case 1: d.input(); file.open("database.dat",ios::out|ios::app|ios::binary); if(!file.is_open()) cout<<"Error opening file"; else { file.write((char *)&d,sizeof(d)); cout<<"Entry added!"<<endl; } file.close(); break; case 2:search_name(); break; case 3:search_no(); break; case 4:display_all(); break; case 5: exit(0); } } } #包括 #包括 #包括 #包括 使用名称空间std; 类数据库 { 字符串名; 长int no; 公众: 无效输入() { coutname; 库特诺; } 无效显示() { 库特

c+中数据文件处理中的分段错误+; 我写了一个C++的小代码,了解数据文件处理。该程序包括接受条目、将条目写入.dat文件以及搜索特定条目。到目前为止,只有写入功能在工作,读取和搜索功能给出了一个分段错误。怎么了 #include<iostream> #include<string> #include<fstream> #include<stdlib.h> using namespace std; class data_base { string name; long int no; public: void input() { cout<<"\nEnter name:"; cin>>name; cout<<"Enter ph number:"; cin>>no; } void display() { cout<<name<<"\t"<<no; } string retname() { return name; } long int retno() { return no; } }; void display_all() { data_base d; fstream in; in.open("database.dat",ios::in|ios::binary); if(!in.is_open()) cout<<"Error opening file"; else{ while(in.read((char *)&d,sizeof(d))) { d.display(); } } in.close(); } void search_name() { data_base d; fstream in; string s; in.open("database.dat",ios::in|ios::binary); if(!in.is_open()) cout<<"Error opening file"; else{ cout<<"\nEnter name to be searched:"; cin>>s; while (in.read((char *) &d,sizeof(d))) { if(s==d.retname()) { d.display(); } } } in.close(); } void search_no() { data_base d; fstream in; long int l; in.open("database.dat",ios::in|ios::binary); if(!in.is_open()) cout<<"Error opening file"; else{ cout<<"\nEnter number to be searched:"; cin>>l; while (in.read((char *) &d,sizeof(d))) { if(l==d.retno()) { d.display(); } } } in.close(); } int main() { int ch; fstream file; data_base d,e; string s; while(1) { cout<<"1.Add entry\n2.Search by name\n3.Search by number\n4.Display all entries\5.Exit"<<endl; cin>>ch; switch (ch) { case 1: d.input(); file.open("database.dat",ios::out|ios::app|ios::binary); if(!file.is_open()) cout<<"Error opening file"; else { file.write((char *)&d,sizeof(d)); cout<<"Entry added!"<<endl; } file.close(); break; case 2:search_name(); break; case 3:search_no(); break; case 4:display_all(); break; case 5: exit(0); } } } #包括 #包括 #包括 #包括 使用名称空间std; 类数据库 { 字符串名; 长int no; 公众: 无效输入() { coutname; 库特诺; } 无效显示() { 库特,c++,C++,您已经注定要在这里失败。std::stringstruct中有一个指针。将此指针重新解释为字符数组将为您提供一些字符序列。您可以将其保存到文件中,稍后再读取它 此时,新读取的数据库变量具有与以前相同的精确二进制表示形式。但现在std::string的内部指针不再指向有效的内存地址,因此segfault 请注意,segfaulting实际上是好的。在一些坏的情况下,内存地址是有效的,但它会指向一些完全不相关的(随机)数据。这将是一个非常难找到的bug 你从一开始就做错了。不要在char*中进行数据

您已经注定要在这里失败。
std::string
struct中有一个指针。将此指针重新解释为字符数组将为您提供一些字符序列。您可以将其保存到文件中,稍后再读取它

此时,新读取的
数据库
变量具有与以前相同的精确二进制表示形式。但现在
std::string
的内部指针不再指向有效的内存地址,因此segfault

请注意,segfaulting实际上是好的。在一些坏的情况下,内存地址是有效的,但它会指向一些完全不相关的(随机)数据。这将是一个非常难找到的bug


你从一开始就做错了。不要在
char*
中进行数据序列化/反序列化转换。使用适当的序列化技术,例如将结构转换为xml、json、google protobuf,甚至提出一些自定义内容。只是不要重新解释原始内存。即使内存中没有指针二进制表示形式的结构取决于编译器、操作系统和cpu。

您不能在
std::string
(或其他非普通类型)上使用
read
write
。字符串包含指向在写入文件时丢失的堆数据的指针。您可能需要阅读。哇,非常感谢。在我将“std::string”更改为字符数组后,代码工作正常。
class data_base
{
  string name;
  ...
}
...
data_base d;
...
file.write((char *)&d,sizeof(d));