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

Delphi Sources



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

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

Подскажите пожалуйста, при чтении из потока в файл выходит ошибка is not a valid integer value.
При записи массива в поток все работает корректно.

Код:
unit TEST1;

interface

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

  const
  MaxElements = 10;

type
  TForm1 = class(TForm)
    SaveButton1: TButton;
    StringGrid1: TStringGrid;
    StringGrid2: TStringGrid;
    LoadButton1: TButton;
    procedure SaveButton1Click(Sender: TObject);
    procedure LoadButton1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.SaveButton1Click(Sender: TObject);
var
  i: integer;
  n: array[1..MaxElements] of integer;
  p1: TStream;
  S: string;
   begin
    for i := 1 to MaxElements do
     n[i]:= (i)*(-2);
      for i := 1 to MaxElements do
       StringGrid1.Cells[1, i]:= intTostr(n[i]);
        begin
         p1 := TFileStream.Create('D:\тест\file34.txt', fmCreate);
          try
           for i := 1 to MaxElements do
           begin
            S := IntToStr(n[i]) + #13#10;
            p1.Write(PChar(S)^, Length(S));
           end;
          finally
        end;
       p1.Free;
     end;
   end;

procedure TForm1.LoadButton1Click(Sender: TObject);
 var
  i:integer;
  k: array[1..MaxElements] of integer;
  p2:TStream;
  f:array[1..10] of string;
   begin
    p2:= TFileStream.Create('D:\тест\file34.txt', fmopenread);
     try
     for i := 1 to MaxElements do begin
      p2.Read(PChar(f[i])^, Length(f));
     // p2.Read(k[1], MaxElements*(SizeOf(integer)));
      // for i := 1 to MaxElements do begin
       k[i]:=strtoint(f[i]);
        StringGrid2.Cells[1, i] := IntToStr(f[i]);
        end;
     finally
   end;
 p2.Free;
  end;
end.
Ответить с цитированием
  #2  
Старый 08.02.2010, 02:35
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,036
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Угумс. Просто ты пишешь данные как строки, но не пишешь длинну.
А длинна кажлого числа тебе потом потребуется для чтения. Вот ты и получаешь ошибки.

Вообще-то, у тебя не самый эффективный способ работы с потоками. Все преимущество потоков ты теряешь. А именно, что в поток пишется только полезные данные.

Если ты хочешь "видеть" в файле свои цифирьки, то не используй поток.
Ну, или если очень приспичило, то набирай данные в TStringList в виде строк, а потом его пиши в поток. Хотя опять-же - не самое эффективное использование потока.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter