Я спрашиваю, зачем вам нужно третий символ менять? Работать с ней, как обычно. Читать и выводить, куда требуется. Поиском по ней можно орудовать. Но зачем нужен какой-то энный символ?
Во-первых, зачем вам это нужно? Во-вторых, в общем случае вы не сможете этого сделать, даже если у вас будет не char, а какой-нибудь 32-битный тип, так как он будет кодировать не символ, а unicode code point.
@Nivs, у меня так и сделано, только не двумя, а одним. Читаем чанки и наращиваем, пока не встретим '\n', затем всё, что перед переводом строки - кормим json.loads, а всё, что после - в новый кусок. Фильтровать содержимое не нужно, в [не pretty] json не должно быть перевода строки, внутри строк он экранируется в "\\n".
@The_Chemis , ну по идее этот код должен работать. Просто для проверки можно попробовать read (www.cplusplus.com/reference/istream/istream/read/), передав туда буффер размером с файл и размер файла.
Мне в голову приходит только история о том, что буква 'я' имеет код 255 (то ли в 866, то ли в 1251), и при конвертации в char становится -1, что равно EOF, но имеет ли это отношение к данному случаю - не знаю. Это можно проверить, обрезав файл и посмотрев, на чём он там спотыкается. В общем, без экспериментов с файлом не обойтись.
Не понял, как вы узнаете, что там "только пробельные символы" до тех пор, пока не прочтёте его весь? В случае, если вы собираетесь его читать весь, чем тогда не нравится текущий код, который завершит работу по окончании входного потока?
Потому что free(data) - это тоже UB, free надо звать только к тому указателю, что вернул malloc. Вы передаёте ему иной указатель, и портите таким образом кучу. Что конкретно и каким именно образом там ломается - я не знаю, гадать не буду, но суть именно в этом.