cout частично печатать без endl

Я печатаю кучу строк следующим образом:

cout<<count<<"|"<<newTime.time<<"|"<<newCat<<"|"<<newCon<<endl;

в котором count — это счетчик, newTime.time — строка времени, а newCat и newCon — строки.
Результат выглядит следующим образом:

06:02:11:20:08|DB Mgr|Sending query: “SELECT * FROM users”

По-видимому, это не учитывалось количество и «|». Однако, если я изменю код на

cout<<count<<"|"<<endl;
cout<<newTime.time<<"|"<<newCat<<"|"<<newCon<<endl;

Выход просто превратился в

2|
06:02:11:20:08|DB Mgr|Sending query: “SELECT * FROM users”

Я сначала подумал, если это проблема буфера. Я изменил endl на flush, но проблема все еще существует.
Спасибо за любую помощь.

1

Решение

Это звуки как твой time строка может иметь возврат каретки \r в этом. Если это так, то вывод с использованием вашего первого метода будет еще вывести количество и разделитель, но \r вернется к началу строки и начнет перезаписывать ее.

Ваш второй метод не будет перезаписывать счетчик, так как он находится в предыдущей строке ( \r будет иметь мало видимый эффект, если вы уже в начале строки).

Если вы работаете на UNIX-подобной платформе, вы можете передать вывод через что-то вроде od -xcb (шестнадцатеричный фильтр дампа), чтобы увидеть, есть ли \r на выходе.

В качестве альтернативы, если в вашем коде есть строка, вы можете увидеть, содержит ли она возврат каретки с чем-то вроде:

std::string s = "whatever";
size_t pos = s.find ('\r');
if (pos != std::string::npos) {
// carriage return was found.
}

Например, следующая программа:

#include <iostream>

int main (void) {
std::string s1 = "strA";
std::string s2 = "\rstrB";
std::string s3 = "strC";

std::cout << s1 << '|' << s2 << '|' << s3 << '\n';
std::cout << "=====\n";

std::cout << s1 << '|' << '\n';
std::cout << s2 << '|' << s3 << '\n';

std::cout << "=====\n";
size_t pos = s2.find ('\r');
if (pos != std::string::npos)
std::cout << "CR found at " << pos << '\n';
return 0;
}

кажется, выводит следующее:

strB|strC
=====
strA|
strB|strC
=====
CR found at 0

но на самом деле эта первая строка на самом деле:

strA|(\r)strB|strC

где (\r) это возврат каретки.


И имейте в виду, что вам редко нужно endl — это эффективно \n с флешем, который в большинстве случаев не нужен. Вы можете просто уйти с использованием \n и пусть автоматическая промывка сама позаботится о себе.

7

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector