读取文件 C++ 上的重复对象
Reading duplicated objects on files C++
我在用 C++ 为我的程序创建文件系统时遇到了一些问题。好吧,我正在创建一个新学生,如果他是我在保存文件和关闭程序之前创建的最后一个对象,它就会被复制。比如两个对象:Daniel,Paul。它只显示最后一个重复的:Daniel, Paul, Paul - 在 file.txt.
这是我的一些代码:
正在阅读文件:
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();
谢谢!!
eof()、bad()、fail() 只有在尝试从文件中读取一些字节但未成功后才会 return 为真。所以,把if验证放在getline()之后。
并且在此之后创建 Student 的新实例以避免内存泄漏。
像那样:
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()
不会 return true
直到您实际尝试读取超出文件末尾的内容,这就是您看到最后一行重复的原因。 getline
将失败并且 ALLTHESTRINGVARIABLES
将包含最近一次成功读取的值。您应该在存储新的 Student
.
之前检查提取是否确实成功
由于您混合了未格式化和格式化的输入,您还应该从流中删除换行符(或您用来分隔记录的任何字符)。
将循环更改为:
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);
}
}
我还建议您不要存储指针(除非您使用动态调度),而是将实际的 Student
对象存储在 std::vector<Student>
中。如果使用动态调度,则将 std::unique_ptr<Student>
存储在 vector
.
中
我在用 C++ 为我的程序创建文件系统时遇到了一些问题。好吧,我正在创建一个新学生,如果他是我在保存文件和关闭程序之前创建的最后一个对象,它就会被复制。比如两个对象:Daniel,Paul。它只显示最后一个重复的:Daniel, Paul, Paul - 在 file.txt.
这是我的一些代码:
正在阅读文件:
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();
谢谢!!
eof()、bad()、fail() 只有在尝试从文件中读取一些字节但未成功后才会 return 为真。所以,把if验证放在getline()之后。
并且在此之后创建 Student 的新实例以避免内存泄漏。
像那样:
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()
不会 return true
直到您实际尝试读取超出文件末尾的内容,这就是您看到最后一行重复的原因。 getline
将失败并且 ALLTHESTRINGVARIABLES
将包含最近一次成功读取的值。您应该在存储新的 Student
.
由于您混合了未格式化和格式化的输入,您还应该从流中删除换行符(或您用来分隔记录的任何字符)。
将循环更改为:
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);
}
}
我还建议您不要存储指针(除非您使用动态调度),而是将实际的 Student
对象存储在 std::vector<Student>
中。如果使用动态调度,则将 std::unique_ptr<Student>
存储在 vector
.