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

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

Запись и чтение файла. [D7]


Endi ©   (2004-08-19 01:52:00) 

Всем привет!

Сегодня возникла проблема, которую я совсем не ждал, да и за проблему никогда не считал.

Такая вот задачка: нужно в файле, нетипизированном, в самом начале записать несколько байтов. Целый день сегодня бьюсь, так и не решил.

Может кто встречался с такой проблемой.
За ранее, спасибо, за помощь.


Endi   (2004-08-20 00:30:00) [1]

icWasya Огромное человеческое спасибо. :)
А я то никак не мог понять, почему при слиянии FileBuf и Buf у меня все время получалась ошибка.


icWasya   (2004-08-19 14:12:00) [2]

в догонку

а как надо

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;


icWasya   (2004-08-19 14:04:00) [3]

[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;


Rem   (2004-08-19 11:17:00) [4]

Reset(F, 1);


Fay   (2004-08-19 11:13:00) [5]


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;


Smithson   (2004-08-19 11:08:00) [6]

SetLenght забыл делать строкам :)


Endi   (2004-08-19 11:04:00) [7]

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 выдает.


Kair_   (2004-08-19 09:37:00) [8]

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. Кажись так... :)


gid   (2004-08-19 09:08:00) [9]

assignfile(f,'c:\qqq');
rewrite(f);
reset(f);
write(f,{переменная тавоже типа что и сям файл});
read(f,,{переменная тавоже типа что и сям файл});
seek()//Куда смещаться
closefile(f);//закрыть

Чего еще непонятно??????????


Алхимик   (2004-08-19 02:01:00) [10]

Как говорится - это не проблема, а задача.
В общем случае:
1.Создал файл.
2.Записал несколько байтов.
3.Присобачил всё остальное.
4.Запомнил имя старого файла.
5.Прибил старый файл.
6.Поменял имя нового файла на имя старого.


Наверх

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