@never_mind

Откуда взялись китайские символы в выводе?

Учусь на первом курсе. На лабораторной работе столкнулся со следующей проблемой.
В задании надо было вывести в файл простые числа используя решето Эратосфена. При поиске простых чисел до "1009" всё работает хорошо. При "1010" и выше - выводит китайские иероглифы. С другой стороны, если поставить два пробела между выводимыми числами или пробел до выводимого числа, то всё работает. Можно выводить с переносом строки - тоже работает. Можете объяснить причину такого поведения?

#include <fstream>
#include <math.h>
using namespace std;
int main()
{
	ofstream fout;
	fout.open("test.txt");
	char msk[] = { 0x80,0x40,0x20,0x10,0x8,0x4,0x2,0x1 };
	const int N = 1000; //в задании было до 100 000. начиная с 1010 появляются иероглифы в выводе
	char r[N / 8 + 1];
	for (int i = 1; i < (N / 8 + 1); ++i) //устанавливаем в 1 все биты
		r[i] = 0xff;
	r[0] = 0x3f; //первые два бита устанавливаем в 0. им соответствуют числа 0 и 1, которые нам неинтересны
	for (int i = 0; i <= sqrt(N); ++i) //самое большое разложение на простые - два корня. найдутся числа меньше или их нет
		if (r[i / 8] & msk[i % 8]) //если бит равен 1
			for (int j = i + i; j < N; j += i) //все кратные ему вычёркиваем
				r[j / 8] &= ~msk[j % 8];
	for (int i = 0; i < N; ++i)
		if (r[i / 8] & msk[i % 8])
			fout << i << " ";
	fout.close();
	return 0;
}
  • Вопрос задан
  • 603 просмотра
Пригласить эксперта
Ответы на вопрос 2
AnnTHony
@AnnTHony
Интроверт
Как вариант, заменить символ-разделитель (добавить запятую):
fout << i << ", ";
Видимо пробелы после определенного символа воспринимаются как указатель на символы Юникода.
Кстати, это только для обычного Notepad-а, в любом другом редакторе корректно открывается.
Ответ написан
Комментировать
whalemare
@whalemare
Еще вероятно: попробуйте изменить кодировку файла на UTF-8, если стоит не она
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы