Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 30.01.2010, 21:57
vladimir01101988 vladimir01101988 вне форума
Прохожий
 
Регистрация: 03.12.2009
Сообщения: 19
Репутация: 10
По умолчанию неверный формат при записи потока в файл

Подскажите пожалуйста, записываю поток в файл, и при открытии файла, там вместо значений нули или иероглифы

Код:
unit TEST1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  i:integer;
  n: array[1..10] of integer;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  p: TStream;
  begin
   for i:= 1 to 10 do 
    n[i]:= (i)*(2);
      p := TFileStream.Create('D:\тест\file34.txt', fmCreate or fmOpenRead    or fmOpenWrite);
       try
         p.WriteBuffer(n, SizeOf(n));
       finally
    p.Free;
  end;
end;

end.
Ответить с цитированием
  #2  
Старый 30.01.2010, 22:17
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,097
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Попробуй p.writebuffer(n[1],Length(n)*sizeof(integer));
Ответить с цитированием
  #3  
Старый 30.01.2010, 22:25
vladimir01101988 vladimir01101988 вне форума
Прохожий
 
Регистрация: 03.12.2009
Сообщения: 19
Репутация: 10
По умолчанию

все равно такая же шляпа((
Ответить с цитированием
  #4  
Старый 30.01.2010, 22:33
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,097
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Тогда пиши поэлементно.
Ответить с цитированием
  #5  
Старый 31.01.2010, 01:48
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Код:
там вместо значений нули или иероглифы
А вы чего ожидали там увидеть?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #6  
Старый 31.01.2010, 09:34
vladimir01101988 vladimir01101988 вне форума
Прохожий
 
Регистрация: 03.12.2009
Сообщения: 19
Репутация: 10
По умолчанию

Хотел увидеть элементы моего массива
Ответить с цитированием
  #7  
Старый 31.01.2010, 10:19
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

число 2 ( integer ) занимает 4 байта и в 16-тиричном коде выглядит:
02 00 00 00
Ответить с цитированием
  #8  
Старый 31.01.2010, 10:22
vladimir01101988 vladimir01101988 вне форума
Прохожий
 
Регистрация: 03.12.2009
Сообщения: 19
Репутация: 10
По умолчанию

Там даже в 16 ричном формате не отображается, пишутся 0, @ и т.п.
Ответить с цитированием
  #9  
Старый 31.01.2010, 12:16
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 663
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Думаю стоит использовать не WriteBuffer, а просто Write.
Ответить с цитированием
  #10  
Старый 31.01.2010, 12:35
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Да не надо там ничего исправлять. Все у него правильно работает, человек просто не понимает, что у него записываются данные как набор байт, а не как набор символов. Позвольте не поверить, что в HEX-формате у вас как вы говорите отображается @. Такого просто быть не может, иначе это не HEX-формат. Может вы видете символьное представление байта рядом? Тогда да, такое вполне возможно.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #11  
Старый 31.01.2010, 12:57
vladimir01101988 vladimir01101988 вне форума
Прохожий
 
Регистрация: 03.12.2009
Сообщения: 19
Репутация: 10
По умолчанию

А как тогда, перевести, чтобы в файле отображались числа массива.
Ответить с цитированием
  #12  
Старый 31.01.2010, 13:08
Drozh Drozh вне форума
Активный
 
Регистрация: 12.06.2008
Сообщения: 313
Репутация: 40
По умолчанию

Цитата:
А как тогда, перевести, чтобы в файле отображались числа массива.
Нужно преобразовать числа в строку, а затем писать в файл
Ответить с цитированием
  #13  
Старый 31.01.2010, 13:38
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Где-то так:
Код:
unit UMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ToolWin;

type
  TForm1 = class(TForm)
    ToolBar1: TToolBar;
    btClear: TToolButton;
    btFill: TToolButton;
    btSave: TToolButton;
    btLoad: TToolButton;
    btToMemo: TToolButton;
    mmResult: TMemo;
    procedure btClearClick(Sender: TObject);
    procedure btFillClick(Sender: TObject);
    procedure btSaveClick(Sender: TObject);
    procedure btLoadClick(Sender: TObject);
    procedure btToMemoClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  IntArr: array[1..10] of integer;

implementation

{$R *.dfm}

procedure TForm1.btClearClick(Sender: TObject);
var
  i: Integer;
begin
  for i := Low(IntArr) to High(IntArr) do
    IntArr[i] := 0;
end;

procedure TForm1.btFillClick(Sender: TObject);
var
  i: Integer;
begin
  for i := Low(IntArr) to High(IntArr) do
    IntArr[i] := i * 2;
end;

procedure TForm1.btSaveClick(Sender: TObject);
var
  p: TStream;
begin
  p := TFileStream.Create('file34.txt', fmCreate or fmOpenRead    or fmOpenWrite);
  try
    p.Seek(0, soBeginning);
    p.WriteBuffer(IntArr[Low(IntArr)], Length(IntArr) * SizeOf(Integer));
  finally
    p.Free
  end;

end;

procedure TForm1.btLoadClick(Sender: TObject);
var
  p: TStream;
begin
  p := TFileStream.Create('file34.txt', fmOpenRead);
  try
    p.Seek(0, soBeginning);
    p.ReadBuffer(IntArr[Low(IntArr)], Length(IntArr) * SizeOf(Integer));
  finally
    p.Free
  end;
end;

procedure TForm1.btToMemoClick(Sender: TObject);
var
  i: Integer;
begin
  mmResult.Clear;

  for i := Low(IntArr) to High(IntArr) do
    mmResult.Lines.Add(IntToStr(IntArr[i]));
end;

end.
Вложения
Тип файла: zip test.zip (2.1 Кбайт, 1 просмотров)
Ответить с цитированием
  #14  
Старый 31.01.2010, 14:04
vladimir01101988 vladimir01101988 вне форума
Прохожий
 
Регистрация: 03.12.2009
Сообщения: 19
Репутация: 10
По умолчанию

Спасибо большое.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:21.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025