You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在文件中跳过意大利语相关条目?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;
}

改动说明

  1. 把输出文件改成filtered_operas.txt,彻底避免覆盖原始输入文件;
  2. 调整读取顺序,严格匹配「作曲家→歌剧→语言」的文件格式;
  3. 不管是否过滤当前条目,都会完整读取一组的三行数据,保证后续读取不会错位;
  4. 增加了文件打开失败的判断,方便快速排查问题。

内容的提问来源于stack exchange,提问作者newtothesite

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 06:37:38