Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Чтение нетипизированного файла. Help!

17K
12 сентября 2006 года
prizz
12 / / 06.09.2006
Задача такая: сделать для программы-клиента локального чата опцию, которая позволяла бы совершать автоматический вход пользователя при запуске. Я сделал всплывающее окно Form2, где юзер вводит айпи хоста, порт и свой ник. При этом, если он ставит галочку на CheckBox1, то создаётся файл, данные из которого при следующем запуске будут сразу заноситься в переменные host, port и nickname. Но почему-то при чтении из файла вылазит ошибка "Read beyond end of file". Что я не так делаю?

Создание файла:
Код:
procedure TForm2.Button1Click(Sender: TObject);
var s: string;
begin
if CheckBox1.Checked then
begin
AssignFile(F,'user.cfg');
Rewrite(F);
s:=Edit1.Text;
BlockWrite(F,s,1);
s:=Edit2.Text;
BlockWrite(F,s,1);
s:=Edit3.Text;
BlockWrite(F,s,1);
CloseFile(F);
end;
end;
Чтение из файла:
 
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
AssignFile(F,'user.cfg');
Reset(F);
BlockRead(F,host,1);
CloseFile(F);
end;
257
12 сентября 2006 года
kosfiz
1.6K / / 18.09.2005
если ты все равно помещаешь в файл строки, то почему бы не работать как с текстовым файлом?
17K
12 сентября 2006 года
prizz
12 / / 06.09.2006
В дальнейшем планируется сохранять и другие данные, которые к тому же не должны быть распознаны пользователем. Проще говоря, чтобы он, открыв user.cfg, не увидел там нормальных символов.
1
13 сентября 2006 года
kot_
7.3K / / 20.01.2000
[QUOTE=prizz]В дальнейшем планируется сохранять и другие данные, которые к тому же не должны быть распознаны пользователем. Проще говоря, чтобы он, открыв user.cfg, не увидел там нормальных символов.[/QUOTE]
Тогда тебе необходимо делать заголовок файла из которого можно было бы получать информацию о его структуре (с какого места начинаются данные какой размер и т.д.) или предполагать что файл имеет четко определенную структуру.
339
13 сентября 2006 года
verybadbug
619 / / 12.09.2005
конешно ошибку выдавать будет.... вопрос на засыпку - а как ты при чтении узнаешь в какой строке сколько символов... )))

со строками лучше так...
Код:
var
  SL: TStrings;
begin
  SL := TStringList.Create;
  try
    SL.Add(Edit1.Text);
    SL.Add(Edit2.Text);
    SL.Add(Edit3.Text);
    SL.SaveToFile('user.cfg');
  finally
    SL.Free;
  end;
end;


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

с нетипизированными файлами лучше работать как с потоками...
Код:
//запись
var
  Stream: TMemoryStream;
  S: String;
  Size: Integer;
begin
  Stream := TMemoryStream.Create;
  try
    S := 'ля-ля-ля';
    Size := Length(S);
    Stream.WriteBuffer(Size, SizeOf(Size));
    Stream.WriteBuffer(S[1], Size);
    Stream.SaveToFile('MyFile.dat');
  finally
    Stream.Free;
  end;
end;
 
//чтение
var
  Stream: TMemoryStream;
  S: String;
  Size: Integer;
begin
  Stream := TMemoryStream.Create;
  try
    Stream.LoadFromFile('MyFile.dat');
    Stream.Position := 0;
    Stream.ReadBuffer(Size, SizeOf(Size));
    SetLength(S, Size);
    Stream.ReadBuffer(S[1], Size);
    ShowMessage(S);
  finally
    Stream.Free;
  end;
end;


примерно так... компилятора нет, поэтому писал всё с головы..
17K
13 сентября 2006 года
prizz
12 / / 06.09.2006
Вот так происходит запись в файл трёх переменных.
Код:
procedure TForm2.Button1Click(Sender: TObject);
var
  Stream: TMemoryStream;
  S: String;
  Size: Integer;
begin
if CheckBox1.Checked then
begin
  Stream := TMemoryStream.Create;
  try
    S := Edit1.Text;
    Size := Length(S);
    Stream.WriteBuffer(Size, SizeOf(Size));
    Stream.WriteBuffer(S[1], Size);
    Stream.SaveToFile('user.cfg');

    S := Edit2.Text;
    Size := Length(S);
    Stream.WriteBuffer(Size, SizeOf(Size));
    Stream.WriteBuffer(S[1], Size);
    Stream.SaveToFile('user.cfg');

    S := Edit3.Text;
    Size := Length(S);
    Stream.WriteBuffer(Size, SizeOf(Size));
    Stream.WriteBuffer(S[1], Size);
    Stream.SaveToFile('user.cfg');
  finally
    Stream.Free;
  end;
end;
end;
Но как сделать считывание этих трёх переменных? У меня получается прочитать только первую.
339
13 сентября 2006 года
verybadbug
619 / / 12.09.2005
[QUOTE=prizz]У меня получается прочитать только первую.[/QUOTE]

а как ты их читаешь?
17K
14 сентября 2006 года
prizz
12 / / 06.09.2006
А кагнадо?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог