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

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

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.09.2013, 16:16   #1
Pir
Пользователь
 
Регистрация: 09.07.2013
Сообщений: 18
По умолчанию Запись/чтение LabeledEdit1

Доброго времени суток!

Есть одна проблемка
Пытаюсь записать в тектовый файл цифры, вводимые в поле LabeledEdit1 вот так:
Код:
int iFileHandle;
iFileHandle = FileOpen("file.text", fmOpenWrite);

FileWrite(iFileHandle, LabeledEdit1->Text.c_str(), LabeledEdit1->Text.Length());

FileClose(iFileHandle);
Работает!

Пытаюсь этим же методом с файла считать:

Код:
int iFileHandle1;
iFileHandle = FileOpen("file.text", fmOpenRead);

FileRead(iFileHandle1, LabeledEdit1->Text.c_str(), LabeledEdit1->Text.Length());

FileClose(iFileHandle);
Не работает. Что может быть? помогите пожалуйста исправить код!


еще 1 вопросик. Можно ли сделать таким же методом сохранение и чтение из какого либо временного файла, чтобы не создавать file.text?

Спасибо!



________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(это кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 04.09.2013 в 17:01.
Pir вне форума Ответить с цитированием
Старый 04.09.2013, 17:03   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
FileRead(iFileHandle1, LabeledEdit1->Text.c_str(), LabeledEdit1->Text.Length());
Не работает.
а почему Вы читаете столько символов, сколько длина текста в LabelEdit1 ?!
Насколько я понимаю, изначально у Вас там пустая строка, значит и прочитается из файла 0 (ноль) символов...
это раз.

во-вторых, я бы всё таки прочитал текст в строковую переменную (пусть будет s), а потом уже присвоил её ( LabeledEdit1->Text = s
и, насколько я понимаю, в С++ перед чтением нужно не просто объявить строковую переменную, но и выделить её нужный размер памяти под читаемые символы!

Последний раз редактировалось Serge_Bliznykov; 04.09.2013 в 17:06.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.09.2013, 08:35   #3
Pir
Пользователь
 
Регистрация: 09.07.2013
Сообщений: 18
По умолчанию

Спасибо Serge, не могли бы Вы написать поподробнее в коде как нужно сделать запись и чтение?
Pir вне форума Ответить с цитированием
Старый 05.09.2013, 11:56   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

во-первых, а почему Вы не хотите для сохранения/чтения воспользоваться INI файлами? Они, в принципе, для этого и придуманы!

во-вторых, я, к сожалению, совсем не знаю C/C++
поэтому предложить Вам адекватное решение - не могу.
так, могу как дилетант/чайник предложить воспользоваться для чтения либо таким кодом:
Код:
   char * Buffer;
   int iFileHandle1 = FileOpen("file.text", fmOpenRead); // открываем файл для чтения
   int FileLength = FileSeek(iFileHandle1, 0, 2);      // определяем длину файла
   FileSeek(iFileHandle1,0,0);                         // переходим на начало файла

   if(FileLength>0) {
     Buffer = new char[FileLength];
     FileRead(hFile, Buffer, FileLength); // прочитаем строку в буфер 
     AnsiString str;

     // для начала попробуем доверить преобразование буфера в ансистроку самому компилятору
     str = Buffer;

     // если так не получится, тогда можно попробовать через приведение типов (ниже вариант 1)
     //str = static_cast<AnsiString>(*Buffer); // если не сработает - смотри ниже

     //  или Вариант 2 до появления стандарта С++
     //str = (AnsiString)*Buffer;
 
    // или Вариант 3
    //str = AnsiString(*Buffer);

    LabeledEdit1->Text = str; // присвоим тексту прочитанную строку
   }

   FileClose(iFileHandle);  // закроем файл
p.s. если код чтения не сработает, то можете попытаться воспользоваться функцией int GetLine(int h,AnsiString *st) из этой темы (только размер буфера buf сделайте не 20, а побольше, с запасом. ну, например, 512)

Последний раз редактировалось Serge_Bliznykov; 05.09.2013 в 12:19.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.09.2013, 10:35   #5
Pir
Пользователь
 
Регистрация: 09.07.2013
Сообщений: 18
По умолчанию

Попробовал Ваш код. Работают все 3 варианта, НО

При выводе отображаются закарючки, видимо где то ансистринг преобразования. Выровнять не получается
Pir вне форума Ответить с цитированием
Старый 06.09.2013, 10:52   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

попробуйте код записи заменить на примерно такой:
Код:
int iFileHandle;
Buffer = new char[LabeledEdit1->Text.Length()];
Buffer = LabeledEdit1->Text;
iFileHandle = FileOpen("file.text", fmOpenWrite);

FileWrite(iFileHandle, Buffer, LabeledEdit1->Text.Length());

FileClose(iFileHandle);
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.09.2013, 11:23   #7
Pir
Пользователь
 
Регистрация: 09.07.2013
Сообщений: 18
По умолчанию

Изменил код записи на Ваш, адаптировал, все равно отображает закарючками.

Если в предложеном Вами коде чтения вместо str=Buffer написать str = (AnsiString)*Buffer, то отображение нормальное, но выходит только первая цифра, (то есть если изначала введу 123- отобразится только 1)
Pir вне форума Ответить с цитированием
Старый 06.09.2013, 12:06   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1-х, посмотрите любым вьевером файл - там текст нормальный?

2-х, ну, что я могу сказать... попробуйте для чтения функцию GetLine (см. ссылку в моём сообщении #4)



p.s. вся проблема в том, что я C/C++ не знаю, а настоящие знатоки то ли не заходят в данную тему, то ли нет желания/возможности подсказать... Вот мы с Вами, два нуба и мучаемся!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.09.2013, 12:19   #9
Pir
Пользователь
 
Регистрация: 09.07.2013
Сообщений: 18
По умолчанию

Ну то что вы не знаете С- это еще вопрос..код же работает, просто есть некоторые тонкости. Значит вы мастер в коде.

А по поводу файла, да, там текст нормальный.

Странно, что так сложно именно с LabeledEdit1. Например, с компонентом Memo1 вообще нет проблем, и запись и чтение работает на ура, причем достаточно просто!

В любом случае Вам большое спасибо за помощь, если что наковыряю, напишу.
Pir вне форума Ответить с цитированием
Старый 06.09.2013, 12:28   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
А по поводу файла, да, там текст нормальный.
отлично. значит, код записи работает, его можно не трогать!

Цитата:
Странно, что так сложно именно с LabeledEdit1.
да нет. Сложно только потому, что Вы это раньше ещё не делали. Как только разберётесь, увидите, что всё это просто!

Цитата:
Например, с компонентом Memo1 вообще нет проблем,
Это, небось, через Memo1->Text.LoadFromFile(имя файла) ?

ну, как вариант, можно объявить переменную класса TStrinList и прочитать через неё (у неё есть метод LoafFromFile()....)

Цитата:
В любом случае Вам большое спасибо за помощь, если что наковыряю, напишу.
угу. обязательно! и попробуте воспользоваться функцией GetLine. есть высокая доля вероятности, что с ней всё сразу заработает!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запись и чтение файлов Bugrimov Общие вопросы C/C++ 14 09.11.2012 09:49
чтение и запись файла VaskaKostolom Паскаль, Turbo Pascal, PascalABC.NET 5 13.09.2011 20:59
Чтение из файла в запись THX35 Фриланс 8 19.03.2010 22:41
Запись....Ок. Чтение....Fail :( Alex Cones Общие вопросы Delphi 9 20.11.2009 10:59