Что может вызвать cout << variable << "\ t";печатать пробел вместо значения, когда вывод превышает ширину терминала? - PullRequest
0 голосов
/ 16 июля 2011

У меня есть серия из трех циклов, каждый из которых состоит из строки \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 значений из 2-го цикла и случайным образом пропускает от 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" на "x\t", программа теперь выводит каждое значение, но, очевидно, с 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 

Ответы [ 4 ]

3 голосов
/ 16 июля 2011

Как обсуждалось в комментариях к вопросу, это похоже на ошибку / причуду в терминале Mac (я думаю, ошибка, но я не знаю, говорит ли спецификация Posix что-то странное о допустимом взаимодействии между вкладками и правая сторона терминала).

Если 11-е значение однозначное (что равно 0), то, по крайней мере, на моем терминале табуляторы устанавливаются так, что вы выводите табуляцию, когда терминал находится точно в конце строки. Если 11-е значение состоит из двух цифр [*], то оно разбивается по строке, поэтому символ табуляции не находится в конце строки. Очевидно, что это не должно быть проблемой, у меня просто есть догадка, что это может быть.

Я не вижу того же результата на моем терминале (это не Mac, это фактически puttycyg в Windows) - для меня вывод этой вкладки перемещает курсор на следующую строку, как и следовало ожидать.

[*] Что 10, так и 0x, а также 26, 11-е значение, которое вы получили из rand() % 30 на вашей машине, посеяв srand(0)

1 голос
/ 16 июля 2011

Хотя проблема, кажется, связана с выводом, может быть другой случай, который следует рассмотреть.

Здесь, в v_objects [q], если v_objects является экземпляром класса, который перегружает оператор [], который принимаетссылка на int, значение q может быть увеличено / изменено там, что приведет к выходу из цикла раньше, чем вы ожидали.

например:

some_type operator[] ( int &a )
{
    // a can be incremented here
    a++;
}

Так как вы этого не сделалидать полный источник, мы не можем найти причину точно.

1 голос
/ 16 июля 2011

выходы есть, это проблема с экраном вывода командной строки, если вы просто сделаете

$ ./a.out> op.txt

и откроете выходной файл, вы увидите выход очень много там.

Также, если вы измените интервал между вкладками на новую строку

"\ t" на "\ n", то вы также можете увидеть вывод на экране.

НоЯ согласен, что есть некоторые проблемы с экраном вывода командной строки при использовании разделителя табуляции

РЕДАКТИРОВАТЬ:

Проблема с размером окна консоли.

для размера62 * 40, число нулей = 9

для размера 90 * 40, количество нулей = 13

для размера 120 * 40, количество нулей = 16

дляразмер 150 * 40, количество нулей = 20

и используя оба моих монитора, я получаю все их ...

для размера 260 * 40, количество нулей = 30

0 голосов
/ 16 июля 2011

Может быть, вы забыли std::endl или std::flush в конце вывода. Простого вывода `\n' недостаточно, чтобы очистить вывод, поэтому вы закончите с коротким выводом.

Случай, когда добавление x сработает, может быть вызван переполнением внутреннего буфера (и последующим выводом), поскольку x увеличивает размер вывода до предела, который вызывает вывод текущего буфера (не происходит, когда буфер короче без x.)

EDIT

Поскольку автор вопроса говорит, что он не работает со сбросом, то единственное, что мне приходит в голову, - это то, что некоторые из этих полей являются символами или строками, которые могут быть пустыми или незаполненными пробелами. (Вот почему важно, чтобы вы показали определение этих типов).

...