Форум: "Основная";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];
ВнизЗапись и чтение файла. Найти похожие ветки
← →
Endi (2004-08-19 01:52) [0]Всем привет!
Сегодня возникла проблема, которую я совсем не ждал, да и за проблему никогда не считал.
Такая вот задачка: нужно в файле, нетипизированном, в самом начале записать несколько байтов. Целый день сегодня бьюсь, так и не решил.
Может кто встречался с такой проблемой.
За ранее, спасибо, за помощь.
← →
Алхимик © (2004-08-19 02:01) [1]Как говорится - это не проблема, а задача.
В общем случае:
1.Создал файл.
2.Записал несколько байтов.
3.Присобачил всё остальное.
4.Запомнил имя старого файла.
5.Прибил старый файл.
6.Поменял имя нового файла на имя старого.
← →
gid (2004-08-19 09:08) [2]assignfile(f,"c:\qqq");
rewrite(f);
reset(f);
write(f,{переменная тавоже типа что и сям файл});
read(f,,{переменная тавоже типа что и сям файл});
seek()//Куда смещаться
closefile(f);//закрыть
Чего еще непонятно??????????
← →
Kair_ (2004-08-19 09:37) [3]var
b: Byte;
begin
AssignFile(F, "FileName");
Rewrite(F, 1);
for b := 1 to 10 do
BlockWrite(F, b, 1);
CloseFile(F);
end;
P.S. Кажись так... :)
← →
Endi (2004-08-19 11:04) [4]2gid
Как это? Ты же файл обнулил. Там уже считывать нечего.
Вот какой код был у меня:
var
Buf,FileBuf:AnsiString;
F:file;
Len:cardinal;
begin
AssignFile(F,"c:\aaa.log");
Reset(F);
Len:=FileSize(F);
BlockRead(F,FileBuf,Len); //считываю весь файл в FileBuf
Rewrite(F);
Reset(F);
Buf:="Added"; //То что нужно записать в начало
BlockWrite(F,Buf,Length(Buf)); //Сначала записываю Buf
BlockWrite(F,FileBuf,Length(FileBuf)); //Теперь записываю FileBuf
CloseFile(F);
end;
Так вот это не работает. То он по 512 байт пишет файлы, то они нулевые, а то, вообще ошибку i/o выдает.
← →
Smithson (2004-08-19 11:08) [5]SetLenght забыл делать строкам :)
← →
Fay © (2004-08-19 11:13) [6]
procedure TForm1.Button3Click(Sender : TObject);
const
BSZ = 1 shl 16;
var
h, nr, nw : DWORD;
p : PChar;
s : string;
begin
s := "Строка, которую ты пишешь в начало. Просто пример"#13#10;
p := nil;
h := INVALID_HANDLE_VALUE;
try
GetMem(p, BSZ);
h := CreateFile("c:\_BOL.sql", GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
if h = INVALID_HANDLE_VALUE then RaiseLastOSError;
ReadFile(h, p^, BSZ, nr, nil);
SetFilePointer(h, 0, nil, FILE_BEGIN);
WriteFile(h, PChar(@s[1])^, Length(s), nw, nil);
while nr > 0 do
begin
WriteFile(h, p^, nr, nw, nil);
ReadFile(h, p^, BSZ, nr, nil);
end;
finally
if h <> INVALID_HANDLE_VALUE then CloseHandle(h);
if p <> nil then FreeMem(p, BSZ);
end;
end;
← →
Rem (2004-08-19 11:17) [7]Reset(F, 1);
← →
icWasya © (2004-08-19 14:04) [8][4]
Вот какой код был у меня:
а как надоvar
Buf,FileBuf:AnsiString;
F:file;
Len:cardinal;
begin
AssignFile(F,"c:\aaa.log");
Reset(F,1); // раз
Len:=FileSize(F);
SetLength(FileBuf,Len);
BlockRead(F,FileBuf[1],Len); //считываю весь файл в FileBuf
closefile(F);
Rewrite(F);
// нафиг Reset(F);
Buf:="Added"; //То что нужно записать в начало
BlockWrite(F,Buf[1],Length(Buf)); //Сначала записываю Buf
BlockWrite(F,FileBuf[1],Length(FileBuf)); //Теперь записываю FileBuf
CloseFile(F);
end;
← →
icWasya © (2004-08-19 14:12) [9]в догонку
а как надо
var
Buf,FileBuf:AnsiString;
F:file;
Len:cardinal;
begin
AssignFile(F,"c:\aaa.log");
Reset(F,1); // раз
Len:=FileSize(F);
SetLength(FileBuf,Len);
BlockRead(F,FileBuf[1],Len); //считываю весь файл в FileBuf
closefile(F);
Rewrite(F,1);// !!!
// нафиг Reset(F);
Buf:="Added"; //То что нужно записать в начало
BlockWrite(F,Buf[1],Length(Buf)); //Сначала записываю Buf
BlockWrite(F,FileBuf[1],Length(FileBuf)); //Теперь записываю FileBuf
CloseFile(F);
end;
← →
Endi (2004-08-20 00:30) [10]icWasya Огромное человеческое спасибо. :)
А я то никак не мог понять, почему при слиянии FileBuf и Buf у меня все время получалась ошибка.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.036 c