Я печатаю кучу строк следующим образом:
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, но проблема все еще существует.
Спасибо за любую помощь.
Это звуки как твой 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
и пусть автоматическая промывка сама позаботится о себе.
Других решений пока нет …