gpt4 book ai didi

c++ - 从文件中删除特定行

转载 作者:太空狗 更新时间:2023-10-29 21:48:18 24 4
gpt4 key购买 nike

我正在尝试通过 C++ 文件中的 id 删除特定行,这是我的代码:

void deleteRow()
{
ifstream inDb("files/students.dat", ios::in);
if(!inDb)
{
cerr << "File could no be opened!\n";
}

cout << countRowsOfDb() << " records." << endl;

Student *studentsArray[countRowsOfDb()];

int n = 0;

while(inDb >> id >> name >> grade >> points >> type)
{
studentsArray[n] = new Student(id, name, grade, points, type);
n++;
}

inDb.close();

for(int i = 0; i < countRowsOfDb(); i++)
{
cout << studentsArray[i]->id << " " << studentsArray[i]->name << " " << studentsArray[i]->grade << " "
<< studentsArray[i]->points << " " << studentsArray[i]->type << "\n";
}

cout << "\nWhich one you would like to delete? Enter an id: ";

string term;
cin >> term;

ofstream outDb("files/students.dat", ios::out);
if(!outDb)
{
cerr << "File could no be opened!\n";
}


for(int i = 0; i < countRowsOfDb(); i++)
{
if(studentsArray[i]->id != term)
{
outDb << studentsArray[i]->id << " " << studentsArray[i]->name << " " << studentsArray[i]->grade << " "
<< studentsArray[i]->points << " " << studentsArray[i]->type << "\n";
}
}

outDb.close();

cout << "\nObject deleted!\n";
}

我创建一个输入文件流,然后获取所有行,使其成为对象数组并将它们显示在屏幕上,然后通过输入 id 询问要删除哪个,当我输入 id 时,我试图将数组的所有这些元素仅放入没有具有相同 id 的元素,但它不起作用,之后文件中没有任何内容。有什么想法吗?

最佳答案

countRowsOfDb() 中的内容?如果它打开文件并计算行数在里面(我不知道它还能做什么),那么它就不会在最后一个循环中找到很多,因为创建了 ostream 与相同的名称将清空文件。

更一般地说,这是一种非常低效的做事方式(并且如果文件格式有误,很容易失败)。处理此问题的最佳方法是使用 std::vector<Student> , 与:

studentVector.push_back( Student( id, name, grade, points, type ) );

在输入循环中。在所有后面的循环中,studentVector.size()给出了条目数,或者您可以使用迭代器。

更好的方法是使用 std::getline在输入,然后初始化一个 std::istringstream解析每一行。这个将更可靠地捕获输入格式错误。像这样的东西:

std::string line;
int lineNumber = 0;
while ( std::getline( inDb, line ) ) {
++ lineNumber;
std::istringstream data( line );
if ( data >> id >> name >> grade >> points >> type ) {
studentVector.push_back( Student( id, name, grade, points, type ) );
} else {
std::cerr << "Format error in lne " << lineNumber << std::endl;
}
}

此外,写入单独的文件通常是一个更好的主意,然后在验证写入有效后重命名它,即:

std::ofstream outDb( "files/students.dat.new" );
// Do output...
outDb.close();
if ( outDb ) {
remove( "files/students.dat" );
rename( "files/students.dat.new", "files/students.dat" );
} else {
std::cerr << "Write error on output" << std::endl;
}

当然,任何写错误都会导致返回 EXIT_FAILURE来自 main . (这是一个全局变量的情况或者单例是合理的——跟踪返回码。)

关于c++ - 从文件中删除特定行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11014929/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com