什么会导致死亡<<变量& lt; & lt;“ t";当输出超过终端宽度时,打印空白而不是值
What can cause cout << variable << " "; to print blankspace instead of a value, when the output exceeds terminal width?
我有一系列三个循环,每个循环包含一行t
分隔值
#include <iostream>
#include <vector>
#include <cstdlib>
using namespace std;
struct the_struct {
float a_float;
the_struct() :a_float(0){}
};
class the_class {public: the_struct a_struct;};
int main ()
{
vector <the_class> v_objects;
for(int q=0; q < 30; q++)
v_objects.push_back(the_class());
srand(0);
int* int_dynamic_array = new int [30];
for(int q=0; q < 30; q++)
int_dynamic_array[q] = rand() % 30;
for(int q=0; q < 30; q++)
cout << q << "t";
cout << "n";
for(int q=0; q < 30; q++)
cout << v_objects[q].a_struct.a_float << "t"; //at runtime, these are all zeros
cout << "n";
for(int q=0; q < 30; q++)
cout << int_dynamic_array[q] << "t"; //random values between 0 and 29
cout << "n";
}
由于某种原因,这段代码只打印了第二个循环中的11个值,并随机省略了第三个循环中的0到4个值。第一个循环从来没有问题。例如(不带制表符):
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
0 0 0 0 0 0 0 0 0 0 0
4 7 2 9 7 4 3 1 6 5 26 12 8 28 13 11 22 7 19 2 26 13 9 12 15 24 8
奇怪的是,如果我将选项卡字符串从"t"
修改为"xt"
,程序现在输出每个值,但显然每个值后面都有一个x。例如:
0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x
正如在问题下面的评论中讨论的那样,这似乎是Mac终端中的一个错误/怪癖(我认为是错误,但我不知道Posix规范是否对制表符和终端右侧之间的允许交互有一些奇怪的规定)。
如果第11个值是个位数(0是),那么至少在我的终端上设置了制表符停止符,这样当终端正好在行结束时输出制表符。如果第11个值是两位数字[*],那么它跨行,因此制表符不在行尾。显然,这个不应该是一个问题,我只是有一种预感,它可能是。
我在我的终端上没有看到相同的结果(这不是Mac,它实际上是Windows上的putycyg) -对我来说,输出该选项卡将光标移动到下一行,正如您所期望的那样。
[*]哪10是,所以是0x,所以是26,第11个值你从rand() % 30
在你的机器上播种srand(0)
虽然问题似乎是关于输出的,但可能还有另一种情况需要考虑。
在v_objects[q]中,如果v_objects是类的实例,该类重载了[]操作符,该操作符接受int的引用,那么q的值可能会在那里增加/改变,这将导致for循环比预期提前退出。
例如:some_type operator[] ( int &a )
{
// a can be incremented here
a++;
}
由于你方没有给出完整的来源,我们无法找到确切的原因。
输出在那里,这是命令行输出屏幕的问题,如果你只做
美元。/。Out> op.txt
并打开输出文件,您将看到输出非常多。
如果你将制表符间距改为新行
"t"到"n",然后你也可以在屏幕上看到输出。
但是我同意在使用制表符
时命令行输出屏幕有一些问题编辑:问题是控制台窗口的大小。
size为62*40;0个数= 9
size为90*40;0个数= 13
,尺寸为120*40;0个数= 16
,尺寸为150*40;0个数= 20
和使用我的监视器,我得到所有的…
,尺寸260*40;0个数= 30
可能您忘记了输出末尾的std::endl
或std::flush
。简单地输出`n'
不足以刷新输出,因此您将得到一个简短的输出。
添加x
可以工作的情况可能是由于内部缓冲区已满(然后输出),因为x
将输出的大小增加到导致当前缓冲区输出的限制(当缓冲区较短而没有x
时不会发生)。
编辑:
作为问题的作者说,它不与刷新工作,那么,我唯一想到的是,其中一些字段是字符或字符串,它们可能是空的,或者已经无意中填充了空格。(这就是为什么显示这些类型的定义很重要的原因)。
- 如何在linux终端中同时编译和运行c++代码
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 终端不会为C++文件创建.exe文件吗
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- <<操作员在下面的行中工作
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- 用于窗口的 HID 终端
- 使用 ubuntu 终端在 c++ 上运行线程类的问题
- 写入文件 a.txt,而终端重定向到文件 b.txt
- VSCode C++终端进程已终止,退出代码为:1
- 终端如何在 shell 提示符下以编程方式阻止退格,以便您无法在其上退格,例如 $ 表示 bash 或 C:\blah\>
- Mac os x app bundle 在下载并运行时崩溃,但在终端或更改 Info.plist 时运行良好
- C printf 无法从终端按预期工作
- 如何在不丢失输出的情况下杀死/停止终端中正在运行的进程?
- 在 OSX 上打开 SDL 窗口时不要打开终端窗口
- 在终端中运行可执行文件与在Mac查找器中打开
- 什么会导致死亡<<变量& lt; & lt;“ t";当输出超过终端宽度时,打印空白而不是值