Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

чтение массива double с помощью TFileStream [D7]


Страницы:   1 2 3 4 5

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]

Самиуилыч бредит, ибо это не родное для его время суток.
Он явно путает ООП с чем-то ещё.


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо