![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
чтение массива double с помощью TFileStream [D7]
Alexander123 © (2012-01-17 18:11:00)Имеется текстовый файл с числами. Пытаюсь считать их вот таким способом:
var
fs: TFileStream;
A: array [0..9] of double;
begin
if opendialog1.Execute then
begin
fs:=TFileStream.Create(opendialog1.FileName, fmOpenRead);
fs.Read(A[0], sizeof(A));
...
При дальнейшей работе получаются значения которых не было в файле. Как решить проблему? Или обязательно считывать данные как byte и потом уже переводить в double?
Inovet (2012-01-19 14:05:00) [1]> [84] Самуилыч (19.01.12 13:53)
> это последнее число будет нужно как-то сращивать
читаешь следующюю порцию в буфер и прдолжаешь парсить.
Самуилыч (2012-01-19 13:53:00) [2]
> Inovet © (19.01.12 12:43) [83]
Это буфер перечитывать придется. Но главное то, что в таком буфере может оказаться нецелое количество чисел - последнее будет обрезано и при перечитывании буфера это последнее число будет нужно как-то сращивать. А это лишний геморрой.
Inovet (2012-01-19 12:43:00) [3]> [80] Самуилыч (19.01.12 12:34)
> выделить буфер, равный размеру файл
Зачем столько много, достаточно и размером с кластер.
Самуилыч (2012-01-19 12:43:00) [4]Об адресах, конечно. Для того и максимальный размер считал, хватит ли дипазона.
Inovet (2012-01-19 12:40:00) [5]> [79] Самуилыч (19.01.12 12:26)
> А свободных адресов для этого нет - получаем ошибку.
>
> Что тут не так?
Ты говорил о
> [76] Самуилыч (19.01.12 10:45)
> соответствующий диапазон адресов, причем этот диапазон не может превышать свободную память.
Если о адресах речь то это и так ясно, а то можно подумать о ещё какой-нибудь памяти.
Самуилыч (2012-01-19 12:34:00) [6]Хотя можно и проще - выделить буфер, равный размеру файла и засосать в него весь файл разом, как советовал Ega23. А потом парсить его, двигая указатель от пробела к пробелу.
Самуилыч (2012-01-19 12:26:00) [7]
> Inovet © (19.01.12 11:29) [78]
Почему неправильно? Процессу выделяется 4Гб памяти, из них нам доступны нижние 2 Гб (кроме самых нижних 64 Кб, но сейчас это неважно). Допустим, в какой-то момент мы использовали эти 2 Гб почти полностью, осталось 1 Мб. И тут мы патаемся замаппить файл размером 5 Мб, причем все 5 Мб в CreateFileMapping и указываем. А свободных адресов для этого нет - получаем ошибку.
Что тут не так?
Inovet (2012-01-19 11:29:00) [8]> [76] Самуилыч (19.01.12 10:45)
> причем этот диапазон не может превышать свободную память.
Это неправильно.
И вообще сомнительно для последовательного чтения. Короче
> [75] Jeer © (19.01.12 10:26)
> Код, давай код и тесты
Самуилыч (2012-01-19 10:50:00) [9]> Jeer © (19.01.12 10:26) [75]
> Код, давай код и тесты - теоретиков и так много на свете,
> а тут глядишь кому-то поможем с реальной задачей :)
Эва... код давай... это ж писать надо, часа 2-3 уйдет, не меньше. А работать за меня Пушкин будет?
Вообще-то, я бы с удовольствием, но не поймут-с... да и Пушкина под рукой нет.
Так что поимку ручного льва в пустыне Сахара придется оставить читателю в качестве самостоятельного упражнения.
Самуилыч (2012-01-19 10:45:00) [10]
> Inovet © (19.01.12 09:39) [74]
Если я правильно понимаю, то для замапливания файла в адресном пространстве процесса нужно зарезервировать соответствующий диапазон адресов, причем этот диапазон не может превышать свободную память.
А если я понимаю неправильно, то пусть меня поправят. Не обижусь, еще и спасибо скажу.
Jeer (2012-01-19 10:26:00) [11]
> Самуилыч (19.01.12 02:40) [71]
..
> Быстрее вряд ли придумаешь.
Код, давай код и тесты - теоретиков и так много на свете, а тут глядишь кому-то поможем с реальной задачей :)
Inovet (2012-01-19 09:39:00) [12]> [71] Самуилыч (19.01.12 02:40)
> Это позволяет замаппить файл (памяти должно хватить)
А при чём тут "памяти хваить"? Какая память имеется ввиду?
Германн (2012-01-19 02:47:00) [13]
> Самуилыч (19.01.12 02:43) [72]
>
>
> > Германн © (19.01.12 02:32) [70]
>
> Извини, если что. Просто [66] ты зря написал.
>
> Ладно, проехали. Предлагаю мир, дружбу, жвачку. И пиво,
> само собой.
>
Пиво я не пью!
Если речь только о пиве - то проехали.
Самуилыч (2012-01-19 02:43:00) [14]
> Германн © (19.01.12 02:32) [70]
Извини, если что. Просто [66] ты зря написал.
Ладно, проехали. Предлагаю мир, дружбу, жвачку. И пиво, само собой.
Самуилыч (2012-01-19 02:40:00) [15]> Jeer © (18.01.12 22:49) [48]
С выделением памяти вроде разобрались, теперь что касается оптимизации работы с файлом. Тоже навскидку - первое, что пришло в голову.
Число строк в файле: не более 10 млн.
Строки ANSI.
Длина каждой строки: не более 27 байт (-N.9N_-N.9N CR LF)
Значит, размер файла не более 270 млн. байт (257 Мб с копейками)
Это позволяет замаппить файл (памяти должно хватить) и далее работать с ним, как с памятью - просто двигая указатель. Быстрее вряд ли придумаешь.
Германн (2012-01-19 02:32:00) [16]
> Самуилыч (19.01.12 02:17) [68]
>
> > Германн © (19.01.12 01:54) [66]
Пардон. Я не оценил вашего юмора.
Но оценил вашу "анонимность"!
Предпочту теперь ваши высказывания не учитывать.
Германн (2012-01-19 02:27:00) [17]
> Самуилыч (19.01.12 02:17) [68]
>
> > Германн © (19.01.12 01:54) [66]
>
> Купи книжку Архангелького и там прочти, что такое ООП. Потом
> приходи сдавать зачет.
Даже в полном бреду, я себе никак не представляю, что буду сдавать зачёт по Архангельскому. Лучше уж сразу пойти в дворники!
Самуилыч (2012-01-19 02:17:00) [18]> Германн © (19.01.12 01:54) [66]
Купи книжку Архангелького и там прочти, что такое ООП. Потом приходи сдавать зачет.
> Ega23 © (19.01.12 01:57) [67]
Тогда поясню. ООП - это объектно-ориентированное программирование (выучи это наизусть). То есть, программирование с использованием объектов.
Ты использовал экземпляр класса TFileStream. А экземпляр класса есть объект (это тоже выучи наизусть). Значит, ты использовал объект.
Теперь вспомни, что программирование с использованием объектов сокращенно называется ООП. Значит, использовав класс TFileStream, ты тем самым применил ООП.
И расскажи все это Германну, чтобы ему на Архангельского не тратиться.
Ega23 (2012-01-19 01:57:00) [19]
> Как? А твой любимый TFileStream - это разве не ООП?
Честно говоря, я даже и не знаю что сказать.
Германн (2012-01-19 01:54:00) [20]
> Ega23 © (19.01.12 01:43) [64]
Самиуилыч бредит, ибо это не родное для его время суток.
Он явно путает ООП с чем-то ещё.