Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2014, 21:04   #1
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию Запись в файл строки длиннее 255

Здравствуйте!
Второй день не могу сообразить. У меня программа записывает в файл данные. Примерно так это реализовано:
Код:
type
  PQuestion=^TQuestion;
  TQuestion=record
   name:string[20];
   ResultCount:Integer;
   ask: String[255];
   answer: String[255];
  end;

...
...
...
var
 fs:TFileStream;
 i:Integer;
 NewQuest:PQuestion;
 voz1:Trzlabel;
begin
  UserList:=TList.Create;
         for i:= 0 to ListView1.Items.Count-1 do
          begin
           NewQuest:=New(PQuestion);
           NewQuest.name:='user';
           NewQuest.ask:=ListView1.Items[i].Caption;
           NewQuest.answer:=ListView1.Items[i].SubItems.text;
           UserList.Add(NewQuest);
          end;
fs:=TFileStream.Create(путь к файлу, fmCreate);
        fs.Write(UserList.count, sizeof(UserList.count));

        for i:=0 to UserList.count-1 do
         fs.Write(PQuestion(UserList[i])^, sizeof(TQuestion));
  UserList.Free;
 fs.Free;
end;
Запись происходит, все в порядке. НО! Не знаю, как записать строку длиннее 255 символов, к примеру если в ListView1.Items[i].Caption будет 500 знаков текста.
В объявлении Record если убрать размер строки, то тогда вообще ничего не записывает в файл, а больше [255] поставить не дает компиллятор. Пробовал заменять и на WideString - проблема та же, не пишет ничего в файл.
Может, кто-нибудь знает и сможет сразу сказать. А то время поджимает, и некогда изучать всю возможную литературу.
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Старый 28.03.2014, 21:12   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

1.Утечки памяти, поскольку не освобождаете память под созданные record-ы до UserList.Free
2. Ну добавьте еще в record поле varchar(255) и пишите в него хвост не уместившийся или пробелы. По другому в данной реализации и по-быстрому не вижу способа
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.03.2014, 21:18   #3
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

Аватар, спасибо, конечно...
1. Не понял насчет утечки, компиллятор не позволяет прописать NewQuest.free
2. Не очень удобное решение проблемы (если вообще решение), потому что обратно считывать из файла данные намучаться можно.

Считывание у меня происходит таким образом:

Код:
  
  fs:=TFileStream.Create(extractfilepath(paramstr(0))+'mains.csc', fmOpenRead);

    fs.Read(Count, sizeof(Count));
    for i:=0 to Count-1 do
     begin
      NewQuest:=New(PQuestion);

      fs.Read(NewQuest^, sizeof(TQuestion));

      if NewQuest.name='user' then
        begin
          with SettForm.ListView1.Items.Add do
           begin
            Caption:=NewQuest.ask;
            SubItems.Add(NewQuest.answer);
           end;
        end;
Как вы понимаете, имена записей у меня не только user, поэтому если что-то дописывать и приписывать вместо единого раза записи/чтения - это накладно.
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Старый 28.03.2014, 21:27   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

1. Освобождение
Код:
  for i:=0 to UserList.Count-1 do Dispose(PQuestion(UserList.Items[i]));
2. По другому при таком подходе ни как. Или отказаться от record и писать/читать как двоичный файл со своей собственной структурой.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.03.2014, 23:32   #5
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Ну как вариант можно вместо типа string использовать array[0..NN] of char. NN поставить достаточно большое.
northener вне форума Ответить с цитированием
Старый 28.03.2014, 23:40   #6
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Ну как вариант можно вместо типа string использовать array[0..NN] of char. NN поставить достаточно большое.
Простите, но это как раз не вариант.
Что будет, если NN не хватит? Или наоборот будет слишком много?
Если, я, конечно, не ошибаюсь, при создании статического массива помять под него выделяется сразу в расчёте на все ячейки.
Поэтому чтобы лучше использовать либо string, либо, на худой конец, динамический массив из char.
Streletz вне форума Ответить с цитированием
Старый 28.03.2014, 23:41   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Динамический здесь не прокатит. И String[255] практически тоже, что статический массив. А просто String аналог динамического массива
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 28.03.2014 в 23:48.
Аватар вне форума Ответить с цитированием
Старый 28.03.2014, 23:47   #8
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Динамический здесь не прокатит. И String[255] практически тоже, что статический массив
Если действовать, образно говоря, "в лоб", то, конечно, не прокатит.
Всё жестко зафиксировано в описании структуры.
Streletz вне форума Ответить с цитированием
Старый 28.03.2014, 23:49   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А по другому она в стреам в съедобном виде не запишется
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.03.2014, 01:11   #10
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от Streletz Посмотреть сообщение
Простите, но это как раз не вариант.
Что будет, если NN не хватит? Или наоборот будет слишком много?
Если, я, конечно, не ошибаюсь, при создании статического массива помять под него выделяется сразу в расчёте на все ячейки.
Поэтому чтобы лучше использовать либо string, либо, на худой конец, динамический массив из char.
Давайте будем говорить о конкретной задаче, а именно о задаче ТС. Иначе лучше использовать БД и не страдать ерундой с хранением сложных данных в типизированном файле.
P.S.
Навскидку не припомню ни одной нынешней программы, которая для чего-то использует типизированные файлы.
northener вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
delphi, запись Pchar строки в файл rax9ray Помощь студентам 5 04.12.2011 16:30
запись в файл с новой строки rowlin Общие вопросы C/C++ 6 22.04.2011 00:30
Запись хвоста ком. строки в файл Lazio Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 27.03.2011 21:18
Запись строки в файл SL1CK Общие вопросы Delphi 3 07.01.2010 16:20