Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> нетипизированные файлы, глюк 
:(
    Опции темы
WERITAS
Дата 9.12.2006, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


********
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 2.5.2005
Где: Москва

Репутация: нет
Всего: 5



Работаю с нетипизированными файлами, вот пытаюсь открыть один в обработчике кнопки (файл уже был создан ранее):

 
Код

fpr: file;
buf: string;
w:   word;
........................................
AssignFile(fpr,'C:\TestSystem\ProgramWork\FPR.dat');
Reset(fpr);
Blockread(fpr,w,SizeOf(w));
SetLength(buf, w);
Blockread(fpr,buf[1],w);
CloseFile(fpr);


Приложение завершается аварийно с сообщением: Access violation at address 00404334 in module 'Project1.exe'. read of address 077BFFF8 
Как прочитать нетипизированный файл,  если в него записанно какое-то слово?  smile 


--------------------
Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак"
PM MAIL   Вверх
Albinos_x
Дата 9.12.2006, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



DRKB (Delphi Russian Knowledge Base)
Код

var 
 FromF, ToF: file;  
  NumRead, NumWritten: Integer;  
  Buf: array[1..2048] of Char;  
 begin 
 if OpenDialog1.Execute then { Display Open dialog box }  
  begin  
    AssignFile(FromF, OpenDialog1.FileName);  
 Reset(FromF, 1); { Record size = 1 }  
  if SaveDialog1.Execute then { Display Save dialog box}  
  begin  
    AssignFile(ToF, SaveDialog1.FileName); { Open output file }  
  Rewrite(ToF, 1); { Record size = 1 }  
  Canvas.TextOut(10, 10, 'Copying ' + IntToStr(FileSize(FromF))+ ' bytes...');  
  repeat  
  BlockRead(FromF, Buf, SizeOf(Buf), NumRead);  
  BlockWrite(ToF, Buf, NumRead, NumWritten);  
  until (NumRead = 0) or (NumWritten <> NumRead);  
 CloseFile(FromF);  
  CloseFile(ToF);  
  end;  
 end;  
 end; 

Цитата





--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
WERITAS
Дата 9.12.2006, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


********
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 2.5.2005
Где: Москва

Репутация: нет
Всего: 5



В этом примере условие остановки чтения из файла 
Цитата
 until (NumRead = 0) or (NumWritten <> NumRead);

А могу я написать? 
Код

while not EOF do

У меня просто нет аналога NumWritten, т.к. в файл не записываю ничего (в этом обработчике) 



--------------------
Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак"
PM MAIL   Вверх
Albinos_x
Дата 10.12.2006, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



можешь...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
WERITAS
Дата 10.12.2006, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


********
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 2.5.2005
Где: Москва

Репутация: нет
Всего: 5



Уже сделал так:
Код

    AssignFile(fpr,'C:\TestSystem\ProgramWork\FPR.dat');
    Reset(fpr,1);
    while not EOF(tfpr) do
     begin
       Blockread(fpr,w,SizeOf(w));
       SetLength(buf, w);
       Blockread(fpr,buf[1],w);
     end;
    CloseFile(fpr);

Все равно вылетает ошибка аварийного закрытия приложения: I/O error 104
Как же все-таки из этого файла прочитать?  smile 


--------------------
Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак"
PM MAIL   Вверх
Alexeis
Дата 10.12.2006, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



WERITAS, попросту размер файла не кратен числу w, и когда идет чтение последнего буфера ему уже не откуда читать весь буфер ведь остаток в файле меньше длинны буфера.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
LamerTM
Дата 10.12.2006, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 11.3.2006

Репутация: нет
Всего: 0



Может попробуешь через FileRead. Я так всегда делаю, мне это понятнее и проще.

Тут должна быть считана строка длиной 100 элементов:
Код

iFileHandle: integer;
Elem=string[100];

iFileHandle := FileOpen(FileName, fmOpenRead);
FileRead(iFileHandle, Elem, SizeOf(Elem));
FileClose(iFileHandle);


Таким образом можно считывать файлы с элементами разной длины, например когда есть заголовок файла и массив данных.
PM MAIL   Вверх
WERITAS
Дата 10.12.2006, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


********
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 2.5.2005
Где: Москва

Репутация: нет
Всего: 5



т.е. Дельфи как бы читает кусками из файла? Это однозначно подстава!  smile  Ну и как быть? smile 


--------------------
Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак"
PM MAIL   Вверх
Alexeis
Дата 10.12.2006, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Просто посчитать сколько там осталось в файле, например из размера файла при каждом чтении вычитать размер буфера, до тех пор пока остаток не станет меньше буфера и уменьшить размер буфера, до размера остатка.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Albinos_x
Дата 10.12.2006, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата(alexeis1 @  10.12.2006,  15:44 Найти цитируемый пост)
WERITAS, попросту размер файла не кратен числу w, и когда идет чтение последнего буфера ему уже не откуда читать весь буфер ведь остаток в файле меньше длинны буфера.

у этой функции есть ещё параметр, который возвращает количество прочитанных элементов байт...
Цитата(WERITAS @  10.12.2006,  15:11 Найти цитируемый пост)
Reset(fpr,1);

что есть 1?
может всё таки так:
Код

Reset(fpr);

Цитата(WERITAS @  10.12.2006,  15:11 Найти цитируемый пост)
while not EOF(tfpr) do

что за tfpr? опечатка?
Цитата(WERITAS @  10.12.2006,  15:11 Найти цитируемый пост)
Blockread(fpr,buf[1],w);

в первый элемент буфера прочитать w элементов... хм... это чего у тебя за буфер такой? ты уверен что в w утебя равно 1?
и уверен ли ты что buf у тебя проинициализирован и содержит хоть один элемент?


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Alexeis
Дата 11.12.2006, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(Albinos_x @  10.12.2006,  18:47 Найти цитируемый пост)
что есть 1?
может всё таки так:

Все правильно для нетипизированых файлов нужно указывать размер одного блока.

Цитата(Albinos_x @  10.12.2006,  18:47 Найти цитируемый пост)
в первый элемент буфера прочитать w элементов... хм... это чего у тебя за буфер такой? ты уверен что в w утебя равно 1?
и уверен ли ты что buf у тебя проинициализирован и содержит хоть один элемент? 


Судя по 
Цитата(WERITAS @  10.12.2006,  15:11 Найти цитируемый пост)
SetLength(buf, w);
 это скорее всего строка либо динамический массив. Если строка, то все верно, если динамический массив, то нужно считать от нуля.



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Albinos_x
Дата 11.12.2006, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата(WERITAS @  9.12.2006,  20:22 Найти цитируемый пост)
buf: string;

так что строка...

Цитата(alexeis1 @  11.12.2006,  00:06 Найти цитируемый пост)
Все правильно для нетипизированых файлов нужно указывать размер одного блока.

да точно... вылетело....

ошибка по видимому, что в buf[1] он пытается прочитать w, а 
Цитата(WERITAS @  10.12.2006,  15:11 Найти цитируемый пост)
SetLength(buf, w);

наверно w при считывании рабна нулю...

Это сообщение отредактировал(а) Albinos_x - 11.12.2006, 13:27


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Alexeis
Дата 11.12.2006, 02:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(Albinos_x @  11.12.2006,  00:33 Найти цитируемый пост)
т.е. в одну букву толкает всю строку...

Ну это вроде как не важно, функция не определяет тип, а только использует адрес первого символа как начало буфера, а вот то, что значение w считываемое из файла неадекватно это вполне может быть, там может оказаться не только ноль но и отрицательное число или слишком большое число и т.д. важно это проконтролировать.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0543 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.