реклама на сайте
подробности

 
 
> Файлы и работа с ними в C++Builder, Сохранение в файле параметров приложения
smk
сообщение May 12 2009, 14:50
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Есть необходимость сохранять в файле значения настройки приложения (набор переменных, которые в идеале хотелось бы видеть в виде int data[50]). Для записи и чтения файла использую функции: SaveToFile(SaveDialog1->FileName); LoadFromFile(OpenDialog1->FileName); . Подскажите пожалуйста как сформировать в файл массив int data[50] для записи и разобрать файл в массив при чтении? А если к массиву понадобится добавить строки то тогда как?


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 20)
Andrew2000
сообщение May 12 2009, 16:33
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 421
Регистрация: 25-12-04
Пользователь №: 1 675



может лучше так?
TIniFile *pIniFile = new TIniFile(ExtractFilePath(Application->ExeName)+"???.ini");
str = pIniFile->ReadString("MAIN","ID","");
и т.д.
Go to the top of the page
 
+Quote Post
DpInRock
сообщение May 12 2009, 17:26
Сообщение #3


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



http://devoid.com.ua/functions-about/c-functions/fwrite.html
или так
http://devoid.com.ua/c-builder/cpp-builder...-v-reestre.html
Просто поразительно.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
smk
сообщение May 12 2009, 22:05
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Есть обработчик события:

Код
FILE *data_file;
AnsiString MyFName ="";
char data[100];

void __fastcall TForm1::N5Click(TObject *Sender)
{
SaveDialog1->FileName=MyFName; //предложить ранее выбранное имя файла
if(SaveDialog1->Execute())
  {
  MyFName=SaveDialog1->FileName; //открыть диалог изменения имени файла
  data_file=fopen("MyFName", "wb");
  fwrite(&data, sizeof(char), 100, data_file);
  }
}

В результате имею файл размером 100 байт с именем myfname. Попытки использовать переменную MyFName в качестве имени файла приводят к ошибке "невозможно преобразовать AnsiString в const char *. Что можно предпринять чтоб сохранилась возможность выбора файла в диалоге?

P.S. ([C++ Error] Unit1.cpp(43): E2034 Cannot convert 'AnsiString' to 'const char *' [C++ Error] Unit1.cpp(43): E2342 Type mismatch in parameter '__path' (wanted 'const char *', got 'AnsiString') )
Строка Memo1->Lines->SaveToFile(SaveDialog1->FileName); пишет текстовый файл без ошибок, но мне нужен список значений переменных.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
SysRq
сообщение May 13 2009, 08:05
Сообщение #5


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(smk @ May 13 2009, 02:05) *
E2034 Cannot convert 'AnsiString' to 'const char *' [C++ Error] Unit1.cpp(43): E2342 Type mismatch in parameter '__path' (wanted 'const char *', got 'AnsiString') )

data_file=fopen(MyFName.c_str(), "wb");

Сообщение отредактировал SysRq - May 13 2009, 08:13
Go to the top of the page
 
+Quote Post
smk
сообщение May 13 2009, 11:28
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Большое СПАСИБО! Ваш совет, SysRq, очень помог. Однако теперь новая проблема:
[C++ Error] Unit1.cpp(33): E2034 Cannot convert 'int' to 'TStrings *'
Как это побороть? Ну и соответственно обратная проблема будет наверно. Задача такая: есть компоненты Panel и Memo. В компоненте Panel отображаются, а из Memo читаются числовые значения, ограниченные диапазоном. Ну вот собственно это и нужно помочь реализовать. А скачать-почитать что-то можно про это?


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
DpInRock
сообщение May 13 2009, 11:43
Сообщение #7


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



В мемо хранятся не числовые значения, а строковые. Их надо преобразовавывать в числовые руками.
http://devoid.com.ua/functions-about/c-fun.../atof-atol.html
Это полный справочник функций. Там по алфавиту. Или его недостаточно?


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
SysRq
сообщение May 13 2009, 12:00
Сообщение #8


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(smk @ May 13 2009, 15:28) *
Однако теперь новая проблема...

Нууу... не совсем понято что вы пытаетесь делать, но могу предположить:
CODE
// некий массив
const int array_sz = 50;
int some_array[array_sz];

// заполняем массив для примера
for(int i = 0; i < array_sz; i++) some_array[i] = i;

// очистка TMemo
Memo1->Clear();

// Вывод содержимого массива в TMemo, каждый элемент на своей строке
for(int i = 0; i < array_sz; i++)
{
Memo1->Lines->Add(IntToStr(some_array[i]));
}
Go to the top of the page
 
+Quote Post
smk
сообщение May 13 2009, 12:30
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



То, что нужно преобразовывать я знаю. Тут сорее ltoa больше подойдет, но не всеравно не выходит. Имею ошибку: [C++ Error] Unit1.cpp(34): E2034 Cannot convert 'char *' to 'TStrings *'

Собственно вопрос:
Код
int U;
  U=(((data[3]*10)+data[2])+(data[1]/10));
  Memo1->Lines=ВОТ ТУТ ЧЕГО НУЖНО ЧТОБ U увидеть (два знакоместа для целых , одно для десятых)???


Цитата
Нууу... не совсем понято что вы пытаетесь делать, но могу предположить:

Суть такова. Есть прибор, которому можно через COM порт передавать управляющие параметры. Под каждую задачу свои настройки. Их надо хранить в разных файлах, как собственно и настройки порта. Ну вот так в кратце.

Цитата
Memo1->Lines->Add(IntToStr(some_array[i]));

Получилось, СПАСИБО! Теперь как-то нужно писать. StrToInt вероятно?
U=StrToInt(Memo1->Lines); - не вкусно говорит.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
SysRq
сообщение May 13 2009, 13:05
Сообщение #10


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Вам бы основы какие почитать.. программирование методом подбора и перебора крайне не хорошо...

Количество строк в TMemo: Memo1->Lines->Count (определено как int).
Доступ к i-й строке: Memo1->Lines->Strings[i] (определено как AnsiString).

StrToInt сработает; если в строке не целое число - получите exception.

PS: int - целочисленный тип, и не понимает дробей.
Go to the top of the page
 
+Quote Post
smk
сообщение May 13 2009, 13:21
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата
Вам бы основы какие почитать.. программирование методом подбора и перебора крайне не хорошо...

Конечно хорошо бы. Подскажите что?
Цитата
StrToInt сработает; если в строке не целое число - получите exception.

PS: int - целочисленный тип, и не понимает дробей.

про integer я в курсе. Потому и преобразовывать в BCD прийдется.
Код
если в строке не целое число - получите exception.

возможно не целое. мне нужно значение (например) 12,3 из текста в число 123 и обратно из 123 текст 12,3
т.е. чтоб я мог на компе в нужной клеточке вписать с клавиатуры 12,3 а в СОМ порт ушло 123 и в файл записалось 123 при сохранении, в виде, например трех char: data[1]=1; data[2]=2; data[3]=3. диапазон изменения переменной либо 0-50 с градацией 0,1 либо 0-5 с градацией 0,01. Вот примерно и все, если не считать настроек порта.

Код
U = StrToInt(Memo1->Lines);
  U=U*10;
  while (U >= 100)
  {U -= 100;data[3]++;}
  while (U >= 10)
  {U -= 10;data[2]++;}
  data[1] = U;

с вот этим затык сейчас.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
smk
сообщение May 13 2009, 16:15
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Код
AnsiString MyMemo1 ="";
long double U;
  
U=25;
FormatFloat(MyMemo1, U);
Memo1->Lines->Add(MyMemo1);

Пытаюсь по Архангельскому разобраться. От вышеприведенного кода не ругается, но и числа 25 не вижу. Подскажите в чем причина? Спасибо.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
SysRq
сообщение May 13 2009, 16:37
Сообщение #13


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(smk @ May 13 2009, 20:15) *
Подскажите в чем причина? Спасибо.
Неверное использование функции.

Установите текстовый курсор на "FormatFloat" в исходнике, и ткните F1. Если документация (оно же хелп) установлена, то она должна явиться и рассказать что:
Цитата
extern PACKAGE AnsiString __fastcall FormatFloat(const AnsiString Format, Extended Value);

Description
FormatFloat formats the floating-point value given by Value using the format string given by Format.
Т.е. строка_в_которую_будет_преобразовано_число = FormatFloat(строка_с_форматом_в_котором_выводить_число_в_строку, само_число).
Форматы указаны там же, в документации. У вас хелп есть? Ну или хотя бы в инете смотрите...
Go to the top of the page
 
+Quote Post
smk
сообщение May 13 2009, 18:32
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Спасибо. Хелп есть. Функция заработала. Теперь пытаюсь заставить работать

Код
AnsiString MyMemo1 ="";
long double U;

MyMemo1=Edit1->Text;
U=ToDouble(MyMemo1);


[C++ Error] Unit1.cpp(134): E2268 Call to undefined function 'ToDouble'
Опять ругается. Что опять не так?

Кажется понял. Ей нужна точка, а у меня запятая. Что делать?


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
SysRq
сообщение May 13 2009, 18:45
Сообщение #15


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Открываем хелп, видим:
Цитата
AnsiString::ToDouble

double __fastcall ToDouble() const;

0) Функция ToDouble принадлежит классу AnsiString;
1) Формальных параметров у функции нет.

число = строка_с_числом.ToDouble()

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

PS: разделитель целой и дробной части числа зависит от системной локали и учитывается автоматически. В русском зпт, в латинице тчк...
Go to the top of the page
 
+Quote Post
smk
сообщение May 14 2009, 07:28
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Есть необходимость воспользоваться такой функцией:

ComPort1.StoreSettings(stIniFile, 'c:\ComPortTest.ini');

Подскажите пожалуйста, как записать вместо 'c:\ComPortTest.ini' чтоб файл всегда создавался в одной директории с программой и в последствии его можно было бы там и искать? Такое возможно? Спасибо!


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
smk
сообщение May 14 2009, 08:32
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Строка
ComPort1->StoreSettings(stIniFile, "ComPortData.ini");
создала файл в C:\WINDOWS , а хочется чтоб было все вместе.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
SysRq
сообщение May 14 2009, 11:29
Сообщение #18


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Можно путь к программе получить так: ExtractFilePath(Application->ExeName)

Тогда: ComPort1->StoreSettings(stIniFile, ExtractFilePath(Application->ExeName) + "ComPortData.ini")
Go to the top of the page
 
+Quote Post
smk
сообщение May 14 2009, 17:21
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Огромное СПАСИБО! Все получилось. Дай Вам Бог здоровья!


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
smk
сообщение Sep 24 2009, 08:02
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Здравствуйте опять! У меня снова проблема с файловыми операциями. Компилятор Borland C++. Мне нужно значения 10 компонентов DateTimePicker->Time сохранять в файле, читать из файла и присваивать соответствующим компонентам. Как это сделать? Спасибо.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
SysRq
сообщение Oct 1 2009, 12:42
Сообщение #21


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Можно так rolleyes.gif
Код
    FILE *fp;
    fp = fopen("C:\\aaa.bin", "wb");
    fwrite(&(DateTimePicker1->DateTime), sizeof(DateTimePicker1->DateTime), 1, fp);

    fclose(fp);

    fp = fopen("C:\\aaa.bin", "rb");
    TDateTime dt;
    fread(&dt, sizeof(dt), 1, fp);
    DateTimePicker1->DateTime = dt;
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 00:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.03101 секунд с 7
ELECTRONIX ©2004-2016