C++实现:根据用户输入的首词删除TXT文件中的指定行
解决TXT文件首词匹配删除行的问题
我来帮你修正这段C++代码,让它实现根据输入的首词删除对应整行的功能。原代码主要有两个问题:一是第一次读取文件后指针已经到末尾,第二个循环读不到内容;二是直接整行对比,没有实现首词匹配逻辑。
问题分析
- 原代码第一次
while(getline(citanjeLinija, linija))把文件内容全部读完后,文件流的指针停在了文件末尾,第二个循环无法再读取任何内容。 - 直接用
linija != izbrisiLiniju做整行对比,不符合“输入首词就删除整行”的需求。
修改后的完整代码
#include <iostream> #include <fstream> #include <string> #include <sstream> using namespace std; int main() { string izbrisiLiniju; string linija; ifstream citanjeLinija("auti.txt"); ofstream brisanjeLinija("temp.txt"); if (!citanjeLiniju.is_open() || !brisanjeLinija.is_open()) { cerr << "无法打开文件!" << endl; return 1; } // 先输出文件内容 cout << "Ispis autiju" << endl; while (getline(citanjeLinija, linija)) { cout << linija << endl; } // 将文件指针重置到文件开头,以便重新读取 citanjeLinija.clear(); // 清除EOF标志 citanjeLinija.seekg(0, ios::beg); // 获取用户输入的首词 cout << "\nUnesite vrstu automobila za izbrisati: " << endl; getline(cin, izbrisiLiniju); // 重新读取文件,匹配首词并写入临时文件 while (getline(citanjeLinija, linija)) { // 提取当前行的首词 stringstream ss(linija); string prvaRijec; ss >> prvaRijec; // 自动以空格为分隔符提取第一个单词 // 如果首词不匹配,就写入临时文件 if (prvaRijec != izbrisiLiniju) { brisanjeLinija << linija << '\n'; } } // 关闭文件流 citanjeLinija.close(); brisanjeLinija.close(); // 替换原文件(删除原文件,将临时文件重命名为原文件名) remove("auti.txt"); rename("temp.txt", "auti.txt"); cout << "Linija je uspješno izbrisana!" << endl; return 0; }
关键修改点说明
- 重置文件指针:读完文件内容后,用
citanjeLinija.clear()清除EOF状态,再用seekg(0, ios::beg)把指针移回文件开头,这样第二个循环才能重新读取内容。 - 首词提取:用
stringstream拆分每行内容,ss >> prvaRijec会自动跳过开头的空白字符,提取第一个以空格分隔的单词,完美匹配需求。 - 文件替换:处理完后用
remove和rename把临时文件替换成原文件,完成最终的删除操作。 - 错误处理:增加了文件打开失败的判断,避免程序崩溃。
内容的提问来源于stack exchange,提问作者ZliAnte
相关产品推荐
相关产品推荐

