【问题标题】:C++ the first cout will not be printedC++ 第一个 cout 不会被打印
【发布时间】:2019-01-11 01:43:44
【问题描述】:

如您所见,在循环开始之前,我在这里有一个 cout。 Seekg 从开头开始,txt 文件中的第一个单词是“Hello”。但它不会打印出来(第一个 cout)。

当我删除 while 循环时,这不是问题,第一个单词会包含在输出中。

第一个“cout”,后面是什么都不应该打印出来吗?下一行代码(这种情况)怎么可能影响它上面的前一个“cout”?

 int main()
 {
    string a;
    ifstream myfile;

    myfile.open("test.txt");
    myfile.seekg(0);

    getline(myfile,a);
    cout << a << endl;

    int z = 0;
    while( a != "x" ) {
        myfile.seekg(z);
        getline(myfile,a);
        z += a.size() + 2;
        cout << a << endl;
    }
}

我还应该提到该文件以“hello”开头,并且包含 600 个换行符和每个换行符上的一个单词。最后一行包含“x”。

[编辑]

这是另一个例子。我相信这会有所帮助。这是我现在的代码:

int main() {

        string a;
        ifstream myfile;
        int newpos = 0;
        myfile.open("example.txt");
        myfile.seekg(newpos);

        getline(myfile,a);


        while (a != "x") {

           myfile.seekg(newpos);

           getline(myfile,a);

           cout << a << endl;

           newpos += a.size() + 2;

        }

}

这是我的文本文件:

hello
johan
nils
erik
john
x

输出与上面的文本文件完全相同。(到目前为止一切顺利)。

但是,然后我在列表/文本文件中添加了大约 600 个新名称(与上面的结构相同,没有更改,只是添加了新名称)。顶部只有一个“你好”,所以我可以跟踪开始,最后一个 x。

这仍然适用于大约 100 个新名称,hello 仍然在开头打印出来。但是当我添加大约 600 个新名称时,不会包括你好(第一个 cout)。这是为什么呢?

【问题讨论】:

  • 1.您没有检查文件是否已成功打开。 2.先seekg没用。 3.什么编译器? 4. 你到底想达到什么目标?
  • 无法复制。为我打印第一行两次。
  • @Mat 我还应该提到该文件以“hello”开头,但包含 600 个换行符和每个换行符上的一个单词。最后一行包含“x”
  • @ZDF 确定。但是如果 seekg 在这里没用真的很重要吗,它仍然从 0 开始,并且第一个“cout”应该被打印出来,无论它之后的循环中发生了什么?如果我错了,请纠正我
  • 1.它应该没有效果。 2.只要你不说明你的编译器,你不发布文件,没有人可以检查它。

标签: c++ cout


【解决方案1】:

但是当我添加大约 600 个新名称时,将不包括 hello(第一个 cout)。
这是为什么?

您的 Screen Buffer Size 似乎不够大,无法显示所有缓冲区行。因此,当打印行数超过特定高度时,控制台开始忽略之前打印的行,导致您认为它没有全部打印出来。

由于您使用的是 Windows,因此您可以尝试增加它

适用于所有控制台应用

  • 右键单击控制台标题并选择默认值
  • 转到布局标签
  • 在屏幕缓冲区大小下,将 Height 增加到( 9001
  • 点击确定然后重启控制台

针对特定应用

  • 右键单击控制台标题并选择属性
  • 转到布局标签
  • 在屏幕缓冲区大小下,将 Height 增加到( 9001
  • 点击确定

请注意,大多数 Windows 操作系统中的默认高度为 9001

【讨论】:

  • 编辑:忘记删除无用的seekg,你读的是行,不是字符。
  • 我没有收到任何错误,我不明白为什么这很重要,当这里的问题是第一个 cout(可能还有其他一些)被“忽略”时?你好是第一个 cout,当我在列表中添加超过 100 个名字时,这会被排除在外。为什么这会影响开始?开头应该是 hello nomatter 什么?我错过了什么?
  • 我将列表中的所有姓名添加到我的 txt 文件中,然后运行与已编辑问题中完全相同的代码。打印出来的名字是Tiphanie,姓氏是Zuzana,然后是x。 (显然输出错误,Tiphanie 不应该是名字)。然后我删除了几乎所有的名字,只将 Aaren 保留给 Adel,现在我得到了正确的输出。 Aaren 是第一个,Adel 是最后一个,然后是 x。
  • 我现在明白你的问题了!您的控制台缓冲区不够大,无法容纳所有这些缓冲区,它会将它们全部打印出来,但是当缓冲区超过特定高度时,控制台开始忽略以前打印的行,导致您认为它没有全部打印出来。看起来您的控制台屏幕缓冲区大小高度仅为 296-297 行。
  • 伟大的东西人。珍惜你的时间。提出答案,我会接受
猜你喜欢
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 2013-12-06
  • 2011-12-25
相关资源
最近更新 更多