Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Файлы и работа с ними в C++Builder
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
smk
Есть необходимость сохранять в файле значения настройки приложения (набор переменных, которые в идеале хотелось бы видеть в виде int data[50]). Для записи и чтения файла использую функции: SaveToFile(SaveDialog1->FileName); LoadFromFile(OpenDialog1->FileName); . Подскажите пожалуйста как сформировать в файл массив int data[50] для записи и разобрать файл в массив при чтении? А если к массиву понадобится добавить строки то тогда как?
Andrew2000
может лучше так?
TIniFile *pIniFile = new TIniFile(ExtractFilePath(Application->ExeName)+"???.ini");
str = pIniFile->ReadString("MAIN","ID","");
и т.д.
DpInRock
http://devoid.com.ua/functions-about/c-functions/fwrite.html
или так
http://devoid.com.ua/c-builder/cpp-builder...-v-reestre.html
Просто поразительно.
smk
Есть обработчик события:

Код
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); пишет текстовый файл без ошибок, но мне нужен список значений переменных.
SysRq
Цитата(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");
smk
Большое СПАСИБО! Ваш совет, SysRq, очень помог. Однако теперь новая проблема:
[C++ Error] Unit1.cpp(33): E2034 Cannot convert 'int' to 'TStrings *'
Как это побороть? Ну и соответственно обратная проблема будет наверно. Задача такая: есть компоненты Panel и Memo. В компоненте Panel отображаются, а из Memo читаются числовые значения, ограниченные диапазоном. Ну вот собственно это и нужно помочь реализовать. А скачать-почитать что-то можно про это?
DpInRock
В мемо хранятся не числовые значения, а строковые. Их надо преобразовавывать в числовые руками.
http://devoid.com.ua/functions-about/c-fun.../atof-atol.html
Это полный справочник функций. Там по алфавиту. Или его недостаточно?
SysRq
Цитата(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]));
}
smk
То, что нужно преобразовывать я знаю. Тут сорее 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); - не вкусно говорит.
SysRq
Вам бы основы какие почитать.. программирование методом подбора и перебора крайне не хорошо...

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

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

PS: int - целочисленный тип, и не понимает дробей.
smk
Цитата
Вам бы основы какие почитать.. программирование методом подбора и перебора крайне не хорошо...

Конечно хорошо бы. Подскажите что?
Цитата
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;

с вот этим затык сейчас.
smk
Код
AnsiString MyMemo1 ="";
long double U;
  
U=25;
FormatFloat(MyMemo1, U);
Memo1->Lines->Add(MyMemo1);

Пытаюсь по Архангельскому разобраться. От вышеприведенного кода не ругается, но и числа 25 не вижу. Подскажите в чем причина? Спасибо.
SysRq
Цитата(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(строка_с_форматом_в_котором_выводить_число_в_строку, само_число).
Форматы указаны там же, в документации. У вас хелп есть? Ну или хотя бы в инете смотрите...
smk
Спасибо. Хелп есть. Функция заработала. Теперь пытаюсь заставить работать

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

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


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

Кажется понял. Ей нужна точка, а у меня запятая. Что делать?
SysRq
Открываем хелп, видим:
Цитата
AnsiString::ToDouble

double __fastcall ToDouble() const;

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

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

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

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

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

Подскажите пожалуйста, как записать вместо 'c:\ComPortTest.ini' чтоб файл всегда создавался в одной директории с программой и в последствии его можно было бы там и искать? Такое возможно? Спасибо!
smk
Строка
ComPort1->StoreSettings(stIniFile, "ComPortData.ini");
создала файл в C:\WINDOWS , а хочется чтоб было все вместе.
SysRq
Можно путь к программе получить так: ExtractFilePath(Application->ExeName)

Тогда: ComPort1->StoreSettings(stIniFile, ExtractFilePath(Application->ExeName) + "ComPortData.ini")
smk
Огромное СПАСИБО! Все получилось. Дай Вам Бог здоровья!
smk
Здравствуйте опять! У меня снова проблема с файловыми операциями. Компилятор Borland C++. Мне нужно значения 10 компонентов DateTimePicker->Time сохранять в файле, читать из файла и присваивать соответствующим компонентам. Как это сделать? Спасибо.
SysRq
Можно так 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;
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.