Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2009, 14:37   #11
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Molotoff Посмотреть сообщение
проблема в том, что 4096 байт разом в переменную размером 1 байт не влезут
Фишка в том, что у Вас массив заведомо нужного размера (как я понимаю). Массив - это монолитный блок и ему без разницы состоит он из 12 однобайтовых символов или из трех 4-байтных целых чисел. Вы передаёте указатель на начало и просите нужное количество байт и всё. А там хоть структуры в массиве храните
pu4koff вне форума Ответить с цитированием
Старый 01.04.2009, 14:49   #12
Molotoff
Пользователь
 
Регистрация: 01.04.2009
Сообщений: 20
По умолчанию

Что сделать, чтоб повысить репутацию пользователя pu4koff?
Molotoff вне форума Ответить с цитированием
Старый 01.04.2009, 17:01   #13
Pashan
Пользователь
 
Регистрация: 18.03.2009
Сообщений: 89
По умолчанию

Molotoff, помнится, делал как-то чтение словаря слов из файла. Это была простая лаб. работа, поэтому заморачиваться не стал - сделал структуру с фиксированной длиной строки и в файле все это хранил одним блоком информации. Чтение вызывал одной операцией. Файл в 50 Мб считывался за долю секунды.

Код:
bool CDictionary::LoadFromFile(LPCTSTR filename)
{
	CFile file;
	if (!file.Open(filename, CFile::modeRead))
		return false;

	// Общее количество слов
	file.Read(&m_WordsCount, sizeof(m_WordsCount));
	m_Words = new SDictionaryWord[m_WordsCount];

	// Слова
	file.Read(m_Words, m_WordsCount * sizeof(SDictionaryWord));

	file.Close();

	return true;
}
Pashan вне форума Ответить с цитированием
Старый 01.04.2009, 17:39   #14
Molotoff
Пользователь
 
Регистрация: 01.04.2009
Сообщений: 20
По умолчанию

2Pashan - и тебе спасибо за помощь, просто то, что предложил pu4koff позволило сократить считывание 280 Мб с получаса в моем варианте до 500 миллисекунд
Molotoff вне форума Ответить с цитированием
Старый 02.04.2009, 14:46   #15
Molotoff
Пользователь
 
Регистрация: 01.04.2009
Сообщений: 20
По умолчанию

Ребят, теперь у меня другая проблема
По задаче нужно бежать от 0 до 2^32
Код:
		for(unsigned int i_c=0; i_c<4294967296; i_c++) 
		{
			if(i_c==100000000) {cout << i_c << endl;}
                          }
уходит в бесконечный цикл, и даже в таком варианте когда i_c<=4294967295
посмотрите незамыленным глазом, что-то уже не могу сообразить что делаю не так
Molotoff вне форума Ответить с цитированием
Старый 02.04.2009, 16:36   #16
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Происходит переполнение.
Завершается итерация цикла, когда у нас i = 4294967295 (Лучше использовать макрос UINT_MAX).
Потом выполняется инкремент: i_c++, но происходит переполнение и поэтмоу в i_c записывается 0, а не долгожданное 4294967296.
Потом выполняется проверка: i_c<4294967296, но ведь ноль меньше этого числа и фактически начинается цикл заново.
Как вариант: unsigned long long int i_c. Переполнения не будет.
ЗЫ. 1 вопрос - 1 тема
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввод имя файла Cdevelop Общие вопросы C/C++ 3 15.03.2009 12:42
Ввод из текстового файла bygoga Паскаль, Turbo Pascal, PascalABC.NET 14 23.11.2008 13:37
Ввод данных Илья Кибель Помощь студентам 1 28.05.2008 11:12
Соударение шариков разных размеров и объемов Стаханов_Андрей Помощь студентам 3 09.03.2008 17:17
Организовать ввод данных с файла созданного в первом задании и вывод их терминал. Saniok Помощь студентам 2 25.10.2007 22:25