Стандартная потоковая печать несвязанных символов - PullRequest
3 голосов
/ 03 марта 2012

Я что-то кодировал, и в некоторых ситуациях мой код работал некорректно, поэтому я решил записать некоторые выходные данные в файл для отладки. Программа просто объединяет некоторые символы из строки (и она не выходит за пределы) и печатает их в файл. Он не имеет ничего общего с сообщениями об ошибках или чем-то еще, а входная строка - просто набор случайных символов. Но я получаю немного мусора в выводе, например:

f::xsgetn error reading the file
sgetn error reading the file
ilebuf::xsgetn error reading the file

(Я удалил вывод программы, и это только лишние вещи.)

Насколько я знаю, если есть какие-либо ошибки, должно быть выдано исключение. Что происходит и как я могу это исправить?

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

PS: по некоторым причинам я не могу опубликовать весь код. Вот часть, которая создает выходные данные и передает их в поток: (tri is и string, и определен ранее. Center является целым числом и находится внутри границ строки. Fout является ранее определенным файловым потоком.)

string op = "" + tri[center];
fout << center << "<>" << op << endl;

Ответы [ 2 ]

1 голос
/ 15 марта 2012

Я столкнулся с той же проблемой в другой программе, где я написал:

str += blablabla + "#";

и я увидел несколько не связанных между собой символов. Я исправил это так:

str = str + blablabla + "#";

и это сработало!

Существует некоторая проблема с оператором += для string.

1 голос
/ 04 марта 2012

Поскольку tri является string, tri[center] является char.
Тип "" - const char[], который нельзя добавить к char.
Вместо этого он неявно преобразуется в const char*, который можно добавить к char.

К сожалению для вас, результатом этого является то, что целочисленное значение tri[center] добавляется к этому указателю как смещение , а не как конкатенация строк, а конкретная область памяти, что результат ссылается на не содержит то, что вы ищете, но вместо этого содержит другие статические строки, такие как, например, "ошибка чтения файла".

Чтобы исправить это, используйте

string op = string ("") + tri [center];

вместо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...