Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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++中创建文件系统时遇到了一些麻烦。我正在创建一个新的学生,如果他是我在保存文件和关闭程序之前创建的最后一个对象,它会被复制。例如,两个对象:丹尼尔,保罗。它只显示了最后一个复制的:Daniel,Paul,Paul-在file.txt中_C++_File_Oop_Fstream_Archive - Fatal编程技术网

读取文件C+上的重复对象+; 我在C++中创建文件系统时遇到了一些麻烦。我正在创建一个新的学生,如果他是我在保存文件和关闭程序之前创建的最后一个对象,它会被复制。例如,两个对象:丹尼尔,保罗。它只显示了最后一个复制的:Daniel,Paul,Paul-在file.txt中

读取文件C+上的重复对象+; 我在C++中创建文件系统时遇到了一些麻烦。我正在创建一个新的学生,如果他是我在保存文件和关闭程序之前创建的最后一个对象,它会被复制。例如,两个对象:丹尼尔,保罗。它只显示了最后一个复制的:Daniel,Paul,Paul-在file.txt中,c++,file,oop,fstream,archive,C++,File,Oop,Fstream,Archive,以下是我的一些代码: 文件读取: ifstream file; file.open("file.txt"); while (1) { Student *p = new Student(); if (file.eof() || file.bad() || file.fail()) { break; } getline(file, ALLTHESTRINGVARIABLES); p->STRINGVARIABLES = ALLTHES

以下是我的一些代码:

文件读取:

ifstream file;
file.open("file.txt");

while (1)
{
Student *p = new Student();
    if (file.eof() || file.bad() || file.fail())
    {
        break;
    }

    getline(file, ALLTHESTRINGVARIABLES);
    p->STRINGVARIABLES = ALLTHESTRINGVARIABLES;

    file >> ANOTHERVARIABLES;
    p->NOTSTRINGVARIABLES = ANOTHERVARIABLES;

    students.push_back(p);
}
file.close();
文件写入:

   fstream file;
   file.open("file.txt", ios::out | ios::trunc);
      for(unsigned int i = 0; i < students.size(); i++){
         file << students[i]->VARIABLEEXAMPLE << endl;
      }
   file.close();
fstream文件;
file.open(“file.txt”,ios::out | ios::trunc);
for(无符号整数i=0;i
如果要避免内存泄漏,只需在此之后创建学生的新实例

就像这样:

while (1)
{
    getline(file, ALLTHESTRINGVARIABLES);
    if (file.eof() || file.bad() || file.fail())
        break;

    Student *p = new Student();
    p->STRINGVARIABLES = ALLTHESTRINGVARIABLES;

    file >> ANOTHERVARIABLES;
    p->NOTSTRINGVARIABLES = ANOTHERVARIABLES;

    students.push_back(p);
}
eof()、bad()、fail()只有在尝试从文件中读取一些字节但未成功后才会返回true。因此,请将if验证放在getline()之后

如果要避免内存泄漏,只需在此之后创建学生的新实例

就像这样:

while (1)
{
    getline(file, ALLTHESTRINGVARIABLES);
    if (file.eof() || file.bad() || file.fail())
        break;

    Student *p = new Student();
    p->STRINGVARIABLES = ALLTHESTRINGVARIABLES;

    file >> ANOTHERVARIABLES;
    p->NOTSTRINGVARIABLES = ANOTHERVARIABLES;

    students.push_back(p);
}
eof()
将不会返回
true
,直到您实际尝试读取文件末尾以外的内容,这就是您看到最后一行重复的原因。
getline
将失败,
所有字符串变量
将包含最近一次成功读取的值。您应该在读取之前检查提取是否确实成功重新存储新的
学员

由于混合了未格式化和格式化输入,还应该从流中删除换行符(或用于分隔记录的任何字符)

将循环更改为:

if (std::ifstream file("file.txt"); file)
{
    while (std::getline(file, ALLTHESTRINGVARIABLES) >> ANOTHERVARIABLES)
    {
        // remove the newline or whatever whitespace char you use as record separator
        file.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

        Student *p = new Student;
        p->STRINGVARIABLES = ALLTHESTRINGVARIABLES;
        p->NOTSTRINGVARIABLES = ANOTHERVARIABLES;
        students.push_back(p);
    }
}
if(std::ifstream文件(“file.txt”);文件)
{
while(std::getline(文件,所有字符串变量)>>其他变量)
{
//删除换行符或任何用作记录分隔符的空白字符
ignore(std::numeric_limits::max(),'\n');
学生*p=新生;
p->STRINGVARIABLES=所有字符串变量;
p->NOTSTRINGVARIABLES=其他变量;
学生们。推回(p);
}
}
我还建议不要存储指针(除非使用动态分派),而是将实际的
Student
对象存储在
std::vector
中。如果使用动态分派,则将
std::unique\u ptr
存储在
vector
eof()中
将不会返回
true
,直到您实际尝试读取文件末尾以外的内容,这就是您看到最后一行重复的原因。
getline
将失败,
所有字符串变量
将包含最近一次成功读取的值。您应该在读取之前检查提取是否确实成功重新存储新的
学员

由于混合了未格式化和格式化输入,还应该从流中删除换行符(或用于分隔记录的任何字符)

将循环更改为:

if (std::ifstream file("file.txt"); file)
{
    while (std::getline(file, ALLTHESTRINGVARIABLES) >> ANOTHERVARIABLES)
    {
        // remove the newline or whatever whitespace char you use as record separator
        file.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

        Student *p = new Student;
        p->STRINGVARIABLES = ALLTHESTRINGVARIABLES;
        p->NOTSTRINGVARIABLES = ANOTHERVARIABLES;
        students.push_back(p);
    }
}
if(std::ifstream文件(“file.txt”);文件)
{
while(std::getline(文件,所有字符串变量)>>其他变量)
{
//删除换行符或任何用作记录分隔符的空白字符
ignore(std::numeric_limits::max(),'\n');
学生*p=新生;
p->STRINGVARIABLES=所有字符串变量;
p->NOTSTRINGVARIABLES=其他变量;
学生们。推回(p);
}
}

我还建议不要存储指针(除非使用动态分派)而是将实际的
Student
对象存储在
std::vector
中。如果使用动态分派,则将
std::unique\u ptr
存储在
vector

中。不相关:不要使用
new
。只需将其设置为
Student p;
并将其设置为
std::vector Student;
以避免手动内存管理。Sh下面是
Student
file.txt
的一个示例。做一个例子。@Ted Lynyo可能是对的,但是由于Student容器包含指针,我们需要一个分配(可能是唯一的还是共享的?).如果没有完整的代码和实际的用例,就无法判断。也就是说,是否有充分的理由使用指针容器?我们无法从给出的信息中判断:(好的,但是为什么不按照我的建议制作学生容器呢?是否正在使用动态调度?无关:不要使用
new
。只需制作
student p;
并制作
std::vector students;
以避免手动内存管理。显示
student
file.txt
的示例。制作一个。@Ted Lynmo're p很可能是这样,但由于学生容器包含指针,我们需要分配(可能是唯一的还是共享的?)。如果没有完整的代码和实际的用例,就无法判断。也就是说,使用指针容器是否有充分的理由?我们无法从给出的信息中判断:(好的,但是为什么不按照我的建议制作学生容器呢?是否正在使用动态调度?Ted,谢谢你的帮助!Derzu,之前回复的程序员收到了复选标记,因为这也是一个解决方案。@DanielCasianchaves,不客气!请注意,如果
文件>>其他变量;
在使用其他answ时失败呃,您将在
向量中添加一个坏的
学生
。此外,如果不删除记录分隔符,我看不出它如何工作。特德,谢谢您的帮助!Derzu,先前回复的程序员收到了复选标记,因为它也是一个解决方案。@DanielCasianchaves,不客气!请注意,如果
文件>>没有HERVARIABLES;
在使用另一个答案时失败,您将向
向量添加一个损坏的
学生
。此外,如果不删除记录分隔符,我看不出它如何工作。