![]() |
|
Модераторы: 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 )
index.txt 17,56 Kb-------------------- Вы все еще курите ? Тогда мы идем к вам |
|||
|
||||
| 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 |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |