Следующий код дает очень странный результат:
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("f1.in");
ofstream g("f1.out");
char sir[255];
int i;
char strlwr(char sir[]) //if void nothing changes
{
int i = 0;
for (i = 0; sir[i] != NULL; i++) {
sir[i] = tolower(sir[i]);
}
return 0; //if instead of 0 is 1 it will kinda work , but strlwr(sir) still needs to be displayed
}
int main()
{
f.get(sir, 255);
g << sir << '\n'; // without '\n' strlwr will no more maters
g << strlwr(sir);
g << sir;
return 0;
}
f1.in:
JHON HAS A COW
f1.out:
䡊乏䠠十䄠䌠坏
桪湯栠獡愠挠睯
Это показывает это только тогда, когда я использую только CAPS.
Я использую Code :: Blocks 13.12 на Ubuntu 14, европейская версия.
Мне было бы очень интересно узнать, почему это показывает это.
Мне интересно знать, дает ли это вам то же самое.
Поздравляем! Вы обнаружили кракозябры! Ваш выходной текст на 100% правильный, но что бы вы ни просматривали, он интерпретирует его как юникод.
Если вы преобразуете вывод Unicode в их шестнадцатеричные числовые значения, проблема станет ясной. (Код заимствован из этот ответ StackOverflow.)
$ cat unicode.txt
䡊乏䠠十䄠䌠坏
桪湯栠獡愠挠睯
$ cat unicode.txt | while IFS= read -r -d '' -n1 c; do printf "%02X\n" "'$c"; done
484A
4E4F
4820
5341
4120
4320
574F
0A
686A
6E6F
6820
7361
6120
6320
776F
0A
Вторая команда читает файл символ за символом и печатает немного порядковый номер Форма в гексе. Причина, по которой каждый символ представляет собой два байта данных, заключается в том, что под вводом понимается UTF-16, 2-байтовая кодировка.
Если вместо этого вы интерпретируете шестнадцатеричный вывод как однобайтовый ASCII (и исправляете порядок байтов), вы можете видеть, что ваша программа работала:
$ cat unicode.txt | while IFS= read -r -d '' -n1 c; do printf "%02X\n" "'$c"; done
484A ; JH
4E4F ; ON
4820 ; H
5341 ; AS
4120 ; A
4320 ; C
574F ; OW
0A ; \n
686A ; jh
6E6F ; on
6820 ; h
7361 ; as
6120 ; a
6320 ; c
776F ; ow
0A ; \n
Чтобы определить, является ли проблема вашей программой на C ++ или программой просмотра, попробуйте выполнить следующую команду xxd f1.out
, Если это похоже на ASCII, то это ошибка ваших программ просмотра. В противном случае, это ошибка вашей программы, и вы должны посмотреть на Setlocale и / или открытие вашего выходного файла в двоичном режиме.
В любом случае, вы, вероятно, должны изменить g<<strlwr(sir);
чтобы просто strlwr(sir);
, В настоящее время он добавляет байт NULL к вашему выводу, что, вероятно, непреднамеренно.