我正在使用C ++进行电话簿项目。我做了一个类,里面有字符串对象来存储一些字符串。
我的程序无法将字符串数据写入文件,并困扰着我。它只会显示最后插入的数据。
这里是示例程序,提供了我想做什么以及问题出在哪里的基本想法。
#include <iostream>
#include <fstream>
using namespace std;
class student {
private:
string name;
int age;
string mail;
public:
void getData(student &s) {
ofstream file;
file.open("file.txt", ios::app);
if(!file) {
cout << "Error in creating file.." << endl;
return;
}
cout << "\nFile created successfully." << endl;
cout << "Enter name: ";
cin.ignore();
getline(cin, name);
cout << "Enter age: ";
cin >> age;
cout<<"Enter mail: ";
cin.ignore();
getline(cin, mail);
file.write((char*)&s, sizeof(s));
file.close();
cout << "\nFile saved and closed succesfully." << endl;
}
void showData(student &s) {
ifstream file1;
file1.open("file.txt", ios::in);
if(!file1){
cout<<"Error in opening file..";
return;
}
while(!file1.eof()){
file1.read((char*) &s, sizeof(s));
cout << "Name: " <<name << "\nAge : " << age << "\nMail: "<< mail << endl;
}
file1.close();
}
};
int main() {
student s;
s.getData(s);
s.getData(s);
s.getData(s);
s.showData(s);
return 0;
}
在这种情况下,我需要帮助。
答案 0 :(得分:2)
std::string
对象基本上不过是指针(指向实际字符串内容)的包装。指针对于每个进程都是唯一的,即使在同一系统上,甚至在运行同一程序的进程之间,也无法轻易在各个进程之间共享指针。
要像您一样能够读写原始对象,该对象必须为trivial,因为您的对象包含非平凡的std::string
成员,所以该对象不是
答案 1 :(得分:0)
std::ifstream
提供与std::cin
相同的接口,而std::ofstream
提供与std::cout
相同的接口。您可以使用函数读取和写入适当的流,而不必复制表示对象的字节。
class student {
private:
string name;
int age;
string mail;
public:
void getData();
void showData();
};
std::istream& operator >> (std::istream& is, const student & s)
{
is.ignore(); std::getline(is, s.name);
is >> s.age;
is.ignore(); std::getline(is, s.mail);
return is;
}
std::ostream& operator << (std::ostream& os, const student & s)
{
return os << s.name << s.age << s.mail;
}
您也不需要将对象传递给它自己的方法。您使用成员,然后读取或写入通过的学生。
void student::getData() {
std::ofstream file("file.txt",ios::app);
if(!file) {
std::cout << "Error in creating file.." << std::endl;
return;
}
std::cout << "\nFile created successfully." << std::endl;
std::cout << "Enter name: ";
std::cin.ignore();
std::getline(std::cin, name);
std::cout << "Enter age: ";
std::cin >> age;
std::cout << "Enter mail: ";
std::cin.ignore();
std::getline(std::cin, mail);
file << *this;
std::cout << "\nFile saved and closed succesfully." << std::endl;
}
void student::showData() {
ifstream file1("file.txt", ios::in);
if(!file1){
std::cout << "Error in opening file..";
return;
}
while(file1 >> *this){
std::cout << "Name: " << name << "\nAge : " << age << "\nMail: " << mail << std::endl;
}
}
int main() {
student s;
s.getData();
s.getData();
s.getData();
s.showData();
return 0;
}
但是getData
和showData
并不真正属于student
。我将其更改为void getStudent(std::istream & src, std::ostream & dest)
和void showStudents(std::istream & src, std::ostream & dest)
,并传入cin
,cout
和main中的文件流。