Форум: "Основная";
Текущий архив: 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