如何在c+中读取文件并存储在对象数组中+; 我学习C++,在文件处理方面有困难。我正在写一个代码作为家庭作业,我必须将对象写入文件,然后立即从文件中读取这些对象作为数组。这是我的密码: #include <iostream> #include <fstream> using namespace std; class Records{ char* name; int roll; public: Records() { name = new char[20]; } void setData() { cout<<"Enter name: "<<endl; cin>>name; cout<<"Enter roll"<<endl; cin>>roll; } char* getname() { return name; } int getRoll() { return roll; } void operator = (Records& no) { name = no.name; roll = no.roll; } }; int main() { int i =0 ; Records rec; rec.setData(); Records::increase(); ofstream fout; fout.open("file.txt", ios::app); fout.write((char*)&rec, sizeof(rec)); fout.close(); Records* results = new Records[20]; Records rec1; ifstream fin; fin.open("file.txt", ios::in); while(!fin.eof()) { fin.read((char*)&rec1, sizeof(rec1)); results[i] = rec1; i++; } fin.close(); cout<<results[0].getRoll(); return 0; } #包括 #包括 使用名称空间std; 课堂记录{ 字符*名称; 整流罩; 公众: 记录() { 名称=新字符[20]; } void setData() { cout

如何在c+中读取文件并存储在对象数组中+; 我学习C++,在文件处理方面有困难。我正在写一个代码作为家庭作业,我必须将对象写入文件,然后立即从文件中读取这些对象作为数组。这是我的密码: #include <iostream> #include <fstream> using namespace std; class Records{ char* name; int roll; public: Records() { name = new char[20]; } void setData() { cout<<"Enter name: "<<endl; cin>>name; cout<<"Enter roll"<<endl; cin>>roll; } char* getname() { return name; } int getRoll() { return roll; } void operator = (Records& no) { name = no.name; roll = no.roll; } }; int main() { int i =0 ; Records rec; rec.setData(); Records::increase(); ofstream fout; fout.open("file.txt", ios::app); fout.write((char*)&rec, sizeof(rec)); fout.close(); Records* results = new Records[20]; Records rec1; ifstream fin; fin.open("file.txt", ios::in); while(!fin.eof()) { fin.read((char*)&rec1, sizeof(rec1)); results[i] = rec1; i++; } fin.close(); cout<<results[0].getRoll(); return 0; } #包括 #包括 使用名称空间std; 课堂记录{ 字符*名称; 整流罩; 公众: 记录() { 名称=新字符[20]; } void setData() { cout,c++,file-handling,C++,File Handling,首先,您必须以二进制模式打开文件进行读写 std::ofstream fou("out_filename",std::ofstream::binary); std::ifstream fin("in_filename", std::ifstream::binary); 其次,赋值运算符=()有问题。它使用相同的地址分配两条记录。因此,在读取过程中,结果[i]中的所有20个元素都共享rec1::name的地址。您必须通过复制name的内容来更正运算符=

首先,您必须以二进制模式打开文件进行读写

 std::ofstream fou("out_filename",std::ofstream::binary);
 std::ifstream fin("in_filename", std::ifstream::binary);
其次,赋值运算符=()有问题。它使用相同的地址分配两条记录。因此,在读取过程中,结果[i]中的所有20个元素都共享rec1::name的地址。您必须通过复制name的内容来更正运算符=()

这不好。

void operator = (Records& no)
{
    name = no.name;
    roll = no.roll;
}
改写如下:

编辑:由于您的对象最初都是使用其内存分配的。因此不需要新的分配

Records& Records::operator=(const Records& no)
{
   // this->name = new char [20]; 
    std::copy_n(no.name, 20, this->name); // include <algorithm>
    roll = no.roll;
    return *this; // return current object for another =.
}

祝你好运!

在修复了一些其他错误后,我发布了这个最终版本供你参考。请注意,这个项目不能对字段“name”使用动态分配。使用动态分配,“name”的20字节不计算为类记录的大小,指针本身不可转移。它会导致字段“name”中的读/写错误


你必须使用原始指针吗?为什么不使用
std::string
?你的类是非常不安全的,因为
char*name
-它会泄漏内存,因为你没有
删除[]
指针。读取。也读取:您不能将指针存储在文件中,以后再使用它们。您需要某种序列化。您所做的是相当低的级别,您不必达到那么低的级别。使用streams
运算符谢谢您,先生!但是我还有一个问题,如何一次显示所有记录,因为我们不知道如何显示g我们的数组是?@SachinBhusal在读取过程中,变量i是获取的记录数。但是由于while(文件结束条件),有一条额外记录的数据与上一条记录的数据重复。请查阅我编辑的部分以获得演示。@SachinBhusal Yes。运行后,您可以转到目录,将file.txt更改为另一个名称,例如filesave.txt。然后重写程序,备注第一部分(输入部分),然后直接转到第二部分:打开filesave.txt并从中读取。当我从文件中读取时,它以二进制形式显示,就像保存在文件中一样。我的意思是它没有以正确的“英语”显示可读文本。为什么?@SachinBhusal当然可以。您以二进制形式保存了它,并且必须以二进制形式打开它。您不能用notepag打开此类文件,也不能将其作为文本文件读取。>>>您可以打开file.txt append模式,该模式允许您继续将新记录写入文件末尾。
Records::~Records() {
delete [] this->name; }
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;

class Records{
    char name[20];
    int roll;
public:
    Records()
    {
      //  name = new char[20];
    }
    void setData()
    {
        cout<<"Enter name: "<<endl;
        cin>>name;
        cout<<"Enter roll"<<endl;
        cin>>roll;
    }
    const char* getname() const
    {
        return name;
    }
    int getRoll() const
    {
        return roll;
    }
    Records& operator = (const Records& no)
    {
        std::copy_n(no.name, 20, this->name);
        roll = no.roll;
        return *this;
    }
};
int main()
{
    int i =0, c ;
    std::string a;
    Records rec;
    ofstream fout;
    fout.open("file.txt", std::ofstream::binary);
    c = 0;
    while (1)
    {
       std::cout << "Input record [" << c << "] ? (y/n) ";
       std::cin >> a;
       if (a[0]=='y' || a[0]=='Y')
        {
          rec.setData();
          fout.write((char*)&rec, sizeof(rec));
          ++c;
        }
        else break;
    }
    fout.close();
// output 
    Records* results = new Records[20];
    Records rec1;
    ifstream fin;
    fin.open("file.txt", std::ifstream::binary);
    while(!fin.eof())
    {
       fin.read((char*)&rec1, sizeof(rec1));
       results[i] = rec1;
       i++;
    }
   fin.close();
   // eidt to print all records
   for (int j=0; j<(i-1); j++)
    {  std::cout << "record # = " << j << std::endl;
       std::cout << "   name = " << results[j].name;
       std::cout << "   roll = " << results[j].roll << std::endl;
    }

   return 0;
}
$ ./a.exe
Input record [0] ? (y/n) y
Enter name:
aaaa
Enter roll
1234
Input record [1] ? (y/n) y
Enter name:
bbbb
Enter roll
2345
Input record [2] ? (y/n) y
Enter name:
cccc
Enter roll
3456
Input record [3] ? (y/n) n
1234