![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
vood |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 271 Регистрация: 23.2.2006 Где: Санкт-Петербург Репутация: нет Всего: 1 |
доброго времени суток!
Столкнулся я с такой проблемой : не получается весь файл считать ! Подскажите более удобное решение(мое решение ниже ![]()
-------------------- Вы все еще курите ? Тогда мы идем к вам |
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
т.е. нужно while (ReadFile(...)) -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
Coala |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 70 Регистрация: 4.5.2006 Где: Москва Репутация: нет Всего: 0 |
А кто мешает определить размер файла, создать буфер соответствующего размера и за один заход считать весь файл в буфер?
ЗЫ - что с файлом-то делать надо? |
|||
|
||||
Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 11 Всего: 61 |
Coala,
Да, интересно будет считывать файл размером метров хотя бы в 600 ![]() Должен быть РАЗУМНЫЙ компромис между скоростью (количество операций чтения) и памятью (размером буфера) -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
vood |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 271 Регистрация: 23.2.2006 Где: Санкт-Петербург Репутация: нет Всего: 1 |
_hunter, у меня компилятор ругается если ставить так
-------------------- Вы все еще курите ? Тогда мы идем к вам |
|||
|
||||
SergeCpp |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: 15 Всего: 124 |
Точку с запятой уберите в конце строки, однако...
![]() while( ReadFile( hFile, str, 1024, &dwBytesRead, NULL ) ); // вот эту вот |
|||
|
||||
vood |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 271 Регистрация: 23.2.2006 Где: Санкт-Петербург Репутация: нет Всего: 1 |
Это опечатка. Но экзешник после изменения
на
очень глючит Это сообщение отредактировал(а) vood - 27.10.2006, 11:42 -------------------- Вы все еще курите ? Тогда мы идем к вам |
||||
|
|||||
sergejzr |
|
||||||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Ну вроде ведь задача так стоит: "считать весь файл сразу". Значит наверное автор проверяет длину перед зачитыванием ![]() Вот кросплатформенная функция определения длины файла
Аот тебе простой, кросплатформенный пример копирования файла. Не раз ещё пригодится ![]() Если за размер буффера возьмёшь длину файла, то он считается "за раз";
|
||||||
|
|||||||
vood |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 271 Регистрация: 23.2.2006 Где: Санкт-Петербург Репутация: нет Всего: 1 |
sergejzr, длину файла я определяю функцией _findfirst
за функцию копирования спасибо, но я пытаюсь считать весь файл( и за один присест у меня это не получится) -------------------- Вы все еще курите ? Тогда мы идем к вам |
|||
|
||||
sergejzr |
|
|||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Зачем её каждый раз определять, когда она в таблице уже есть? Почему? Файл большой? |
|||
|
||||
vood |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 271 Регистрация: 23.2.2006 Где: Санкт-Петербург Репутация: нет Всего: 1 |
это просто долго) файлов нужно много обрабатывать
определять нужно тк у себя модуля sys/stat.h я не нашел а findfirst мне удобней Добавлено @ 12:21 но мой вопрос еще остается в силе(см 1 пост) -------------------- Вы все еще курите ? Тогда мы идем к вам |
|||
|
||||
sergejzr |
|
|||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Тогда я не понимаю смысл вопроса и проблемы
Разве ЭТО не считает весь файл?
ПС: sys/stat.h - стандартная вещь есть в любом компиляторском наборе. Что у тебя за компилер? Хотя конечно, бегай по файлу, если есть желание. |
|||
|
||||
vood |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 271 Регистрация: 23.2.2006 Где: Санкт-Петербург Репутация: нет Всего: 1 |
sergejzr, понимаете, меня сам метод Ваш не устраиваетю. Файлы надо обрабатывать по 50-60 кб, экзешник будет запущен не раз, а память у меня на компе всего 512мб. Лично Вам огромное спасибо за участие, но я бы хотел узнать еще и другие мнения.
Это сообщение отредактировал(а) vood - 27.10.2006, 12:29 -------------------- Вы все еще курите ? Тогда мы идем к вам |
|||
|
||||
jnb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 4.10.2006 Репутация: нет Всего: 1 |
Попробуй использовать проецируемые в память файлы.
В таком случае сразу получишь указатель на буфер и избавишься от необходимости копирования файлов в память. Почитать можно у Рихтера. |
|||
|
||||
vood |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 271 Регистрация: 23.2.2006 Где: Санкт-Петербург Репутация: нет Всего: 1 |
Какой такой Рихтер?
-------------------- Вы все еще курите ? Тогда мы идем к вам |
|||
|
||||
Coala |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 70 Регистрация: 4.5.2006 Где: Москва Репутация: нет Всего: 0 |
Всего...У многих и 256 нету
Разве это размер? Это мелочь, а не файлы. 1. Определяешь размер файла filesize 2. Выделяешь буфер этого размера char *buf = new char[filesize] 3. Читаешь файл целиком ReadFile(hFile, buf, filesize, &dwBytesRead, NULL ); 4. Что ты там с ним дальше будешь делать - не знаю... 5. Но после всех обработок освободи память - delete [] buf. 6. Можешь начать обрабатывать следующий файл - goto п.1 |
|||
|
||||
jnb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 4.10.2006 Репутация: нет Всего: 1 |
||||
|
||||
sergejzr |
|
|||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Это Memory Mapped Files? Вдё равно файл в память там копируется. И мой вариант быстре будет. (вообще, наврядли чтото ещё более быстрое есть, если только на асме писать..) |
|||
|
||||
Coala |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 70 Регистрация: 4.5.2006 Где: Москва Репутация: нет Всего: 0 |
Люди! Одумайтесь! Ради 60 кил маппингом заниматься?
|
|||
|
||||
_stranger_ |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 3.10.2006 Где: город-герой Киев Репутация: 2 Всего: 2 |
попробуй так
что-то типа этого ... |
|||
|
||||
vood |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 271 Регистрация: 23.2.2006 Где: Санкт-Петербург Репутация: нет Всего: 1 |
экзешник истошно зовет DWWIN.EXE(то бишь не работает)
Это сообщение отредактировал(а) vood - 27.10.2006, 12:51 -------------------- Вы все еще курите ? Тогда мы идем к вам |
|||
|
||||
jnb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 4.10.2006 Репутация: нет Всего: 1 |
Вроде не совсем так. Файл используется так же как page file, который кстати тоже является памятью системы. И мы точно в этом случае избавляемся от лишнего копирования. Без сомнения. Но у каждого метода есть плюсы и минусы. Причем vood скорее озабочен экономией памяти а не процессорного времени. Да и вообще пусть почитает, как с файлами работать можно. |
|||
|
||||
vood |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 271 Регистрация: 23.2.2006 Где: Санкт-Петербург Репутация: нет Всего: 1 |
Компелирую под DEV c++
вот весь код, может в нем баг
Экзешник запускается с параметром имя входного файла. В выходном файле (e-mails.txt) должны быть все подстроки из входного которые содержат хотябы 1 точку и собаку Это сообщение отредактировал(а) vood - 27.10.2006, 12:57 -------------------- Вы все еще курите ? Тогда мы идем к вам |
|||
|
||||
sergejzr |
|
|||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Хмм. А это что тогда? А вообще уже два примера дал и зачитание "за раз" и буффером "частями". Короче, я наверное не понимаю, вопроса и проблемы ![]() Вообще, всё выглядит так, что с файлом чтото не в порядке, а не с кодом. |
|||
|
||||
vood |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 271 Регистрация: 23.2.2006 Где: Санкт-Петербург Репутация: нет Всего: 1 |
sergejzr, файл обычный текстовый
-------------------- Вы все еще курите ? Тогда мы идем к вам |
|||
|
||||
jnb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 4.10.2006 Репутация: нет Всего: 1 |
||||
|
||||
sergejzr |
|
|||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
vood, т5ы бы ещё пару фйлов - данных скинул
|
|||
|
||||
vood |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 271 Регистрация: 23.2.2006 Где: Санкт-Петербург Репутация: нет Всего: 1 |
это весь исходник
-------------------- Вы все еще курите ? Тогда мы идем к вам |
|||
|
||||
sergejzr |
|
|||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Ты же какие-то файлы зачитываешь! Исходник сам по себе работает.
|
|||
|
||||
vood |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 271 Регистрация: 23.2.2006 Где: Санкт-Петербург Репутация: нет Всего: 1 |
он не много не читабелен изза того что половина переменных названа женскими именами
-------------------- Вы все еще курите ? Тогда мы идем к вам |
|||
|
||||
sergejzr |
|
|||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
И вообще: "<>,:;'?/\|)
скорее всего должно быть: "<>,:;'?/\\|) |
|||
|
||||
vood |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 271 Регистрация: 23.2.2006 Где: Санкт-Петербург Репутация: нет Всего: 1 |
вот файл.
Это сообщение отредактировал(а) vood - 27.10.2006, 13:07 Присоединённый файл ( Кол-во скачиваний: 18 ) ![]() -------------------- Вы все еще курите ? Тогда мы идем к вам |
|||
|
||||
sergejzr |
|
|||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
И проблема у тебя по-видимому в этой строчке:
for (olesya=0;olesya<strlen(masha);olesya++) str_repl(str,masha[olesya],' '); |
|||
|
||||
vood |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 271 Регистрация: 23.2.2006 Где: Санкт-Петербург Репутация: нет Всего: 1 |
Ее смысл: заменить все символы массива маша из строки str на пробелы
Добавлено @ 13:11 как он может быть причиной проблемы если в предыдущих версиях(которые считывали только один раз буфером в 1024б) все работало хорошо? Это сообщение отредактировал(а) vood - 27.10.2006, 13:13 -------------------- Вы все еще курите ? Тогда мы идем к вам |
|||
|
||||
jnb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 4.10.2006 Репутация: нет Всего: 1 |
i= ReadFile(hFile,str,1024, &dwBytesRead, NULL);
str[strlen(str)]=';'; не понятно: читает из файла 1024 байта. потом получает длину строки до первого "\n" запихивает на это место ; а если не встретился в этих 1024 байтах "\n" или он как раз 1024тый, то получит невалидный индекс лучше читать этот файл по строкам |
|||
|
||||
vood |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 271 Регистрация: 23.2.2006 Где: Санкт-Петербург Репутация: нет Всего: 1 |
помоему strlen всегда считал длину всей строки, включая #13?
-------------------- Вы все еще курите ? Тогда мы идем к вам |
|||
|
||||
sergejzr |
|
|||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
А так, например, что кусок файла, это ещё далеко не string и кидать его в функции типа strlen, str_replace, printf нельзя. ("нормальная" строка заканчиваетс '\0') Во цторых, ты считываешь по 1024 байт, а количество натурально считанных байт это i и оно может отличаться от 1024. (На все же файлы кратны 1024). Ну короче, там много недоработок в связи с тем, что кусками читаешь. Посмотри, подумай, исправь, а потом уже дальше будем думать. |
|||
|
||||
vood |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 271 Регистрация: 23.2.2006 Где: Санкт-Петербург Репутация: нет Всего: 1 |
понятно. Вопрос (с ходу): strlen заменить на sizeof?
-------------------- Вы все еще курите ? Тогда мы идем к вам |
|||
|
||||
sergejzr |
|
|||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Предварительно проблема решается обьявлением:
char str[1025]="0"; и модификацией i= ReadFile(hFile,str,1024, &dwBytesRead, NULL); str[i]=0; |
|||
|
||||
Coala |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 70 Регистрация: 4.5.2006 Где: Москва Репутация: нет Всего: 0 |
Не, ну если в цикле память не чистить, то можно и 2-х гектарную память за...ать
|
||||
|
|||||
sergejzr |
|
|||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Нет! Обьясняю сразу. sizeof ты можешь пользоваться только если сам где-то эту величину указал или на стандартных типах данных. Ты указал ввеличину выше char str[1024] А значит sizeof всегда вернёт тебе 1024. Единственно правильно о длине говорит i |
|||
|
||||
vood |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 271 Регистрация: 23.2.2006 Где: Санкт-Петербург Репутация: нет Всего: 1 |
НО ведь ReadFile возвращает булеан?
а размер прочитанного стоит в dwBytesRead -------------------- Вы все еще курите ? Тогда мы идем к вам |
|||
|
||||
sergejzr |
|
|||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Точно. Значит его надо использовать вместо i.
|
|||
|
||||
vood |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 271 Регистрация: 23.2.2006 Где: Санкт-Петербург Репутация: нет Всего: 1 |
Добился того что не вылетает
похоже ошибка возникала изза этого нулевого байта Это сообщение отредактировал(а) vood - 27.10.2006, 13:32 -------------------- Вы все еще курите ? Тогда мы идем к вам |
|||
|
||||
sergejzr |
|
|||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Можно ещё спросить, что вы с исходниками форума делает?
|
|||
|
||||
vood |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 271 Регистрация: 23.2.2006 Где: Санкт-Петербург Репутация: нет Всего: 1 |
это вы мне?
-------------------- Вы все еще курите ? Тогда мы идем к вам |
|||
|
||||
sergejzr |
|
|||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
А кому? В приаттаченном файле - исходинк форума
|
|||
|
||||
vood |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 271 Регистрация: 23.2.2006 Где: Санкт-Петербург Репутация: нет Всего: 1 |
я вообще только для тестирования использую.
тк они имеют сложную структуру для парсинга Добавлено @ 13:36 какой блин исходник?это просто хтмл код одной его странцы -------------------- Вы все еще курите ? Тогда мы идем к вам |
|||
|
||||
sergejzr |
|
|||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
ХТМЛ код и есть исходный код страницы. |
|||
|
||||
vood |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 271 Регистрация: 23.2.2006 Где: Санкт-Петербург Репутация: нет Всего: 1 |
Заработало!!!!Наконецто!!
Добавлено @ 13:49 sergejzr, ты мужжик! Спасибо тебе!! -------------------- Вы все еще курите ? Тогда мы идем к вам |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |