如何在文件中跳过意大利语相关条目?C++代码正确性及功能验证咨询
关于C++过滤意大利语歌剧条目的代码问题解答
你的代码方向是对的——核心思路是读取文件条目并过滤掉意大利语内容,但有几个关键问题会导致它无法正常工作,甚至完全不出结果,我帮你拆解一下:
主要问题点
- 输入输出文件路径重复:你同时用
ofstream和ifstream打开了同一个operas.txt文件。当ofstream以默认模式打开文件时,会直接清空原文件内容,这就导致后续ifstream根本读不到任何原始数据,自然输出为空。 - 读取顺序与文件格式不匹配:你提到文件格式是「作曲家姓名、歌剧名称、语言」依次排列,但代码里先读作曲家,紧接着就读语言,完全跳过了歌剧名称的读取,这会让所有条目的对应关系彻底混乱。
- 过滤时未跳过对应条目:当遇到意大利语条目时,你没有读取对应的歌剧名称行,这会导致下一次循环的
getline读到本该跳过的歌剧名称,把它当成新的作曲家姓名,整个读取序列彻底错位。
修正后的代码
#include <iostream> #include <fstream> #include <string> using namespace std; int main() { ifstream fileIn("c://Users/myname/Desktop/operas.txt"); // 输出文件用不同路径,避免覆盖原始文件 ofstream fileOt("c://Users/myname/Desktop/filtered_operas.txt"); if (!fileIn.is_open() || !fileOt.is_open()) { cout << "无法打开文件!" << endl; return 1; } string composer, opera, language; // 严格按照文件格式顺序读取:作曲家→歌剧→语言 while (getline(fileIn, composer)) { getline(fileIn, opera); getline(fileIn, language); if (language != "Italian") { fileOt << composer << endl; fileOt << opera << endl; } } fileIn.close(); fileOt.close(); return 0; }
改动说明
- 把输出文件改成
filtered_operas.txt,彻底避免覆盖原始输入文件; - 调整读取顺序,严格匹配「作曲家→歌剧→语言」的文件格式;
- 不管是否过滤当前条目,都会完整读取一组的三行数据,保证后续读取不会错位;
- 增加了文件打开失败的判断,方便快速排查问题。
内容的提问来源于stack exchange,提问作者newtothesite
相关产品推荐
相关产品推荐

