【问题标题】:Why does the console overwrite output?为什么控制台会覆盖输出?
【发布时间】:2026-02-19 15:45:02
【问题描述】:

我正在开始为具有大约 8000 个 ID 的文件编写 csv 文件解析器。运行时,大约一半的 Id 被读取和打印后,Clion 控制台开始覆盖第一个输出,以便在我的控制台输出中运行第一个 Id 结束时是第 2626 个而不是第一个。我的代码中有什么对此负责?

在开关开始之前打印每个读取的字符时,输出完成。当我将 csv 中的数量缩短到 6000 左右时,它也适用于少量的 Id。

int main() {

string buffer;
char zeichen;
ifstream eingabe;
eingabe.open("../lib/Daten.csv");
int zustand=0;//0=Token, 1=Werte

if(eingabe){
    while(!eingabe.eof()) {
        eingabe.get(zeichen);
        //cout<<zeichen; // with only this it works
        switch(zeichen){
            case';':
                if(zustand==0){
                    cout<<"Token: "<<buffer<<"; ";
                }
                else if(zustand==1){
                    cout<<"Wert: "<<buffer<<"; ";
                }
                buffer="";
                break;
            case'\n':
                if(zustand==0){
                    zustand=1;
                    cout<<"Token: "<<buffer<<endl;
                }
                else if(zustand==1){
                    cout<<"Wert: "<<buffer<<endl;
                }
                buffer="";
                break;
            default:
                buffer+=zeichen;
                break;
        }
    }

}
eingabe.close();

   return 0;
}

【问题讨论】:

  • 听起来像是 Clion 的东西。试着写一个更简单的程序,只输出 8000 行文本,看看你会不会遇到同样的问题。
  • 首先请阅读Why is iostream::eof inside a loop condition considered wrong? 然后除非这是为了练习或学校(或类似)作业,不要尝试自己创建 CSV 解析器,使用现有的图书馆代替。虽然 CSV 文件似乎很容易解析,但它包含许多特殊情况和特殊情况,这使得创建通用解析器变得非常困难和重要。
  • 至于你的问题,你试过flushstd::cout吗?
  • @PaulSanders 我尝试简单地输出这些行而不以任何特殊方式解析它们,然后打印所有行。
  • 在假设它是您的代码之前,一定要在常规终端中测试输出。我见过 Clion 终端做了一些奇怪的事情。

标签: c++ clion


【解决方案1】:

由 cmets 中所有乐于助人的人回答。好像和Clion有关

【讨论】:

  • 确实如此。记忆是非常宝贵的资源。但是可以在设置中更改控制台缓冲区大小。
  • 你试过这个吗:Override console cycle buffer size
  • 好主意,我会试试的!谢谢