读取文件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;
在使用另一个答案时失败,您将向向量添加一个损坏的学生
。此外,如果不删除记录分隔符,我看不出它如何工作。