Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.05.13;
Скачать: [xml.tar.bz2];

Вниз

Чтение текстового файла, открытого другой программой.   Найти похожие ветки 

 
Chilly Willy   (2002-04-24 18:22) [0]

Народ, может кто-нибудь сталкивался с субжем?
Есть некий f:textfile.
Делаю все по канонам,

assignfile(f,<имя файла>);
reset(f);

И в этот момент мне IOResult возвращает 32. Но я пытаюсь
прочитать

readln(f,s);
При этом s почему-то оказывается последней строкой файла.
проверяю...eof(f) = true :(

Может ктонибудь знает, как это сделать, срочно надо?


 
Song   (2002-04-24 20:57) [1]

Скорей всего Вы не закрыли файл при прошлой такой же процедуре.


 
Anatoly Podgoretsky   (2002-04-24 21:13) [2]

filemode=0


 
Chilly Willy   (2002-04-25 08:59) [3]

Дело не в том и не в другом:
1.Файл МОЖНО открыть другой прогой(пробовал, фар открвывает....даже нотепад открывает).
2. FileMode я уже пробовал, нефига не работает. К тому же
это НЕ для textfile 8(


 
Anatoly Podgoretsky   (2002-04-25 10:19) [4]

Точно не для текстовых :-(


 
Chilly Willy   (2002-04-25 11:30) [5]

Вот тото и оно. У меня начинает появляться смутное ощущение, что это просто-напросто недосмотр разработчиков. Бага.
Пока что изваратился, и сделал так - делаю временную копию файла(на АПИ) и работаю с ней. Но хочется более удобного и элегантного кода...


 
Song   (2002-04-25 11:41) [6]

Да фигня какая. У всех рабоает чтение текстового файла, а у Вас - нет. Приведите полный код. 100 % - Ваша ошибка.


 
Chilly Willy   (2002-04-25 12:13) [7]

2Song:
Я же говорю, файл открыт другой программой.
Для сравнения - запускаю Richedit из набора демонстрационных приложений, идущий в поставке с дельфой. Пытаюсь открыть файл - и в итоге ничего не получается. А фар этот файл читает. И нотепад читает.
Пробовал еще делать memo1.lines.loadfromfile(<filename>) - тоже никаког результата. Так что причем тут моя ошибка? Если очень интересно, то вот код, ничего там извратного нету:

function GetUsersFromFile(fname:string;var UIS:userinfostruc;var count:byte):boolean;
var f:textfile;
s,param_name,param_value:string;
begin
{$I-}
count:=0;
result:=false;
clearuis(uis);
assignfile(f,fname);
reset(f);
if IOResult<>0 then exit;//здесь то какраз и возвращается 32
repeat
repeat
readln(f,s);
{если отключена проверка IOResult, то в s мы получаем последнюю строку файла. eof соответсвенно стоит в true}
until (eof(f)) or (parse(s,param_name,UIS[count].name));
if not eof(f) then
repeat
readln(f,s);
parse(s,param_name,param_value);
FillUserInfo(UIS[count],param_name,param_value);

until (UIS[count].name<>"")
and (UIS[count].RunMode<>"")
and (UIS[count].IsMono<>"")
and (UIS[count].DateTime<>"")
and (UIS[count].ComputerName<>""); //крутим цикл, пока все поля не будут заполнены


inc(count);
until eof(f);
closefile(f);
if count>0 then result:=true;
{$I+}
end;





 
Song   (2002-04-25 12:52) [8]

Используйте для чтения файла TMemoryStream, кстати в FAQ этот вопрос есть!


 
Chilly Willy   (2002-04-25 15:28) [9]

Хехе. Тут вся фенька в том, что ВООБЩЕ я его прочитать могу. Но мне нужно обязательно через readln. У меня просто есть здоровенный модуль, и полностью его переписывать у меня просто нет времени.


 
Aleksandr   (2002-04-25 15:50) [10]

Дык, если надо readln, значит, там строки отбитые #13#10? Ну так не парьтесь, а сделайте в три раза проще:

begin
with TStringList.Create do try
LoadFromFile(FileName);
DoSomething
finally
Free
end;
Он и считает весь файл, и оперировать со строчками можно, как угодно...


 
Chilly Willy   (2002-04-25 16:25) [11]

Это я пробовал. Еще вчера. По всей видимости TStringList читает точно также - reset и readln. Потому что не работает 8(


 
Aleksandr   (2002-04-25 16:49) [12]

Что значит - не работает?
воткни точку останова на загрузке и попробуй удалить в это время из какого-нить шелла файл. Если не даст, значит, кем-то ты файл открыл и не закрыл... А вообще - моветон это, с текстовыми файлами работать, когда есть стримы и прочее...


 
Chilly Willy   (2002-04-26 10:49) [13]

С текстом в виде textfile на самом деле работать намного удобнее и проще, чем со стримами. Разве что данный случай - исключение. Но это уже непонятно по чьей вине.
Да и памяти на работу с потоками больше расходуется, ИМХО.


 
PVOzerski   (2002-04-26 11:31) [14]

Есть один трючок, мой любимый, на такие случаи жизни.
Суть трюка - подмена handle в структуре file или text на значение, полученное средствами API.
Делается это так. Handle хранится во внутренней структуре по смещению 0, поэтому добраться
до него очень просто: например,

var
t:system.text;
h:tHandle absolute t;
begin
system.assign(t,"nul");
reset(t);
h:=CreateFile("text.txt",GENERIC_READ,FILE_SHARE_READ....


 
Chilly Willy   (2002-04-27 09:39) [15]

Во! Вот это уже дельный совет. Спасибо, сейчас полезу пробовать.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.05.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.005 c
1-39787
MisterBin
2002-04-29 09:08
2002.05.13
Загрузка текста по словам


1-39763
DPetrovich
2002-04-28 10:19
2002.05.13
import VCL в ActiveX


1-39690
alex-ran
2002-04-26 17:47
2002.05.13
Управление выпадаюшим списком ComboBox-а


14-39857
KAA
2002-04-02 11:03
2002.05.13
Сервис память кушает


4-39904
RESEt
2002-03-08 16:24
2002.05.13
Выключить комп програмно.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский