Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> из Pchar в string 
V
    Опции темы
Vladimir1988
Дата 7.2.2010, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 2.12.2009

Репутация: нет
Всего: нет



Подскажите пожалуйста как перевести из Pchar в string 
Вот часть кода:

Код

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)
    StringGrid2: TStringGrid;
    LoadButton1: TButton;
    procedure LoadButton1Click(Sender: TObject);

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

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.LoadButton1Click(Sender: TObject);
 var
  i:integer;
  p2: TStream;
  k: array[1..MaxElements] of integer;
  F: string;
  Length: Integer;
   begin
    p2 := TFileStream.Create('D:\тест\file34.txt', fmopenread);
     try
      Length := p2.Size;
      SetLength(F, Length);
      for I := 1 to MaxElement do
      p2.Read(PChar(F)^, Length);
      k[i] := strtoint(F); // в этой строке мне необходимо прочитать в массив
      finally
      p2.Free;
      end;
   for I := 1 to MaxElement do
    StringGrid2.Cells[1, I] := IntToStr(k[I]);

end;
 end.

PM MAIL   Вверх
Keeper89
Дата 7.2.2010, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



Цитата(Vladimir1988 @  7.2.2010,  11:58 Найти цитируемый пост)
Подскажите пожалуйста как перевести из Pchar в string 

StrPas(F) или string(F).

Только зачем это здесь?

Это сообщение отредактировал(а) Keeper89 - 7.2.2010, 14:35


--------------------
PM MAIL WWW   Вверх
CodeMonkey
Дата 7.2.2010, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



PChar-а не увидел. У вас файл читается в строку F. Строчка p2.Read(PChar(F)^, Length); - это эквивалент p2.Read(Pointer(F)^, Length); или p2.Read(F[1], Length); Никакой PChar строки тут нет. Есть String.

А вот логика вашего цикла странна. Что у вас в этом текстовом файле и что вы хотите оттуда прочитать?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Vladimir1988
Дата 7.2.2010, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 2.12.2009

Репутация: нет
Всего: нет



Мне необходимо из потока записать в массив.

Добавлено через 1 минуту и 54 секунды
в текстовом файле находятся положительные и отрицательные числа и их обязательно через поток надо записать в массив

Добавлено через 7 минут и 7 секунд
Что то получилось, только выходит сообщение (см вложение)
Код

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.LoadButton1Click(Sender: TObject);
 var
  i:integer;
  p2: TStream;
  k: array[1..MaxElements] of integer;
  F: string;
  Length: Integer;
   begin
    p2 := TFileStream.Create('D:\тест\file34.txt', fmopenread);
     try

      Length := p2.Size;
      SetLength(F, Length);
      for I := 1 to MaxElements do
      p2.Read(PChar(F)^, Length);
      k[i] := strtoint(F);
      StringGrid2.Cells[1, I] := IntToStr(k[I]);
      finally
      end;
      p2.Free;

end;
 end.


Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  __________.JPG 153,42 Kb
PM MAIL   Вверх
kami
Дата 7.2.2010, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



Цитата(Vladimir1988 @  7.2.2010,  14:36 Найти цитируемый пост)

Length := p2.Size;
...
for I := 1 to MaxElements do      
  p2.Read(PChar(F)^, Length);



То ли лыжи не едут, то ли весь файл за 1 раз считывается в переменную f. Потом, (на следующих витках цикла) соответственно, читается в нее мусор. Да и что делать со всем файлом сразу в строке - я не представляю, но уж точно StrToчто-нибудь будет выдавать ошибки хотя бы из-за размера строки.  smile 

Это сообщение отредактировал(а) kami - 7.2.2010, 15:41
PM MAIL WWW   Вверх
CodeMonkey
Дата 7.2.2010, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Цитата(Vladimir1988 @  7.2.2010,  14:36 Найти цитируемый пост)
в текстовом файле находятся положительные и отрицательные числа

[вырезано цензурой]....  а КАК они там записаны, мы должны угадать? Через пробел-ли, каждое число - с новой строки, или табуляцией или ещё как.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Vladimir1988
Дата 7.2.2010, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 2.12.2009

Репутация: нет
Всего: нет



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

Код

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(k[i]);
        end;
     finally
   end;
 p2.Free;
  end;
end.


PM MAIL   Вверх
CodeMonkey
Дата 7.2.2010, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Совет: отформатируйте код и вы увидите проблему:
Код
procedure TForm1.LoadButton1Click(Sender: TObject);
var
  i: integer;
  p2: TStream;
  k: array[1..MaxElements] of integer;
  F: string;
  Length: Integer;
begin
  p2 := TFileStream.Create('D:\тест\file34.txt', fmopenread);
  try
    Length := p2.Size;
    SetLength(F, Length);
    for I := 1 to MaxElement do
      p2.Read(PChar(F)^, Length);
    k[i] := strtoint(F); 
  finally
    p2.Free;
  end;
  for I := 1 to MaxElement do
    StringGrid2.Cells[1, I] := IntToStr(k[I]);
end;


Добавлено через 3 минуты
Ага, значит у вас записано по числу на строчку.

Тогда уточнение: вам принципиально использование TFileStream? Загрузка через TStringList была бы проще.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Vladimir1988
Дата 8.2.2010, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 2.12.2009

Репутация: нет
Всего: нет



Принципиально использование потока.
PM MAIL   Вверх
CodeMonkey
Дата 8.2.2010, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Тогда нормальный вариант будет:
1. Считать весь файл за раз в строку.
2. Сделать while-цикл по строке. Условие цикла - пока в строке есть #13#10 (разделитель строк).
3. Каждая итерация цикла отрезает от прочитанной строки подстроку до очередного #13#10 и заносит в массив.

Пункт 1 у вас уже выполнен. Только почему он сидит в цикле - загадка.
Пункт 2 реализуется циклом while, вам также понадобится функция Pos, чтобы узнать позицию #13#10 в F.
Пункт 3 реализуется функциями Copy и (опционально) Delete для "откусывания" подстроки.

Готовый код я принципиально не хочу вам давать.

Программирование означает, что иногда вам нужно сложить вместе несколько частей.

Кусочки я вам назвал и даже сказал, как их надо соединить. Ваша задача - тупо набить код.
 


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Vladimir1988
Дата 8.2.2010, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 2.12.2009

Репутация: нет
Всего: нет



Спасибо. 
PM MAIL   Вверх
Vladimir1988
Дата 8.2.2010, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 2.12.2009

Репутация: нет
Всего: нет



Добрый вечер. Написал код, но в массив пишутся какие то странные числа, явно не из файла.

Вот код:

Код

procedure TForm1.LoadButton1Click(Sender: TObject);
 var
 LS, LE, i:integer;
  k: array[1..MaxElements] of integer;
  p2:TStream;
  f:array[1..10] of string;
  W: string;
    begin
    p2:= TFileStream.Create('D:\тест\file34.txt', fmopenread);
     try
     p2.Read(PChar(W)^, p2.size);
     LS := 1;
     LE := Pos(#13#10, W);
      I:=0;
      while(LE> 0) do begin
      i:=i+1;
       f[i] := Copy(W, LS, LE - LS);
       delete (W,LS, LE - LS);
       LS := LE + 2;
      end;
        for i := 1 to MaxElements do
        k[i]:=StrToInt(f[i]);
        for i := 1 to MaxElements do
        StringGrid2.Cells[1, I] := IntToStr(k[i]);
      finally
     p2.Free;
     end;
  end;
end.

PM MAIL   Вверх
Rennigth
Дата 8.2.2010, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



Цитата(Vladimir1988 @  8.2.2010,  22:07 Найти цитируемый пост)
Добрый вечер. Написал код, но в массив пишутся какие то странные числа, явно не из файла.

Вот код:


Особо ни в код ни в топик не вдавался(время поджимает), но как я понимаю сейчас у Вас первая проблемма в том что Вы не устанавливаете курсор на начало файла. На сколько помню у TFileStream есть метод Seek для этого.


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
CodeMonkey
Дата 8.2.2010, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Цитата(Vladimir1988 @  8.2.2010,  22:07 Найти цитируемый пост)
но в массив пишутся какие то странные числа, явно не из файла

А точно не врёте? У вас код нерабочий. Куда (и зачем) вы убрали SetLength?

Проблема №2: массив F имеет размер только 10 элементов. А если MaxElements больше 10? Впрочем, на этот вопрос можно не отвечать, т.к. на самом деле там не нужен массив. Вы вынесли чтение из файла и заполнение массива в два разных цикла. Вопрос: зачем? Объедините их в один. Откусили строку - тут же её в k загнали. Тогда и массив не понадобится, т.к. на очередной итерации мы можем откусывать в ту же переменную (на самом деле, даже переменной не надо: k[i] := StrToInt(Copy(...)); + Inc(i) и Delete).

Цитата(Rennigth @  8.2.2010,  22:49 Найти цитируемый пост)
 как я понимаю сейчас у Вас первая проблемма в том что Вы не устанавливаете курсор на начало файла

Сразу после TFileStream.Create указатель и так стоит на начале файла, никакой Seek не нужен.

Добавлено через 1 минуту и 46 секунд
Ах, да, проблема №3: условие выхода из цикла никогда сработает, т.к. LE у вас в цикле не меняется.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Rennigth
Дата 8.2.2010, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



Цитата(CodeMonkey @  8.2.2010,  23:22 Найти цитируемый пост)
Сразу после TFileStream.Create указатель и так стоит на начале файла, никакой Seek не нужен.

Проверить сейчас не могу  smile, но Вам верю на слово  smile 


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0614 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.