|
Файлы и работа с ними в C++Builder, Сохранение в файле параметров приложения |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 20)
|
May 12 2009, 22:05
|
Гуру
     
Группа: Свой
Сообщений: 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); пишет текстовый файл без ошибок, но мне нужен список значений переменных.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
May 13 2009, 12:00
|

Чайник, 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])); }
|
|
|
|
|
May 13 2009, 12:30
|
Гуру
     
Группа: Свой
Сообщений: 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); - не вкусно говорит.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
May 13 2009, 13:21
|
Гуру
     
Группа: Свой
Сообщений: 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; с вот этим затык сейчас.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
May 13 2009, 16:37
|

Чайник, 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( строка_с_форматом_в_котором_выводить_число_в_строку, само_число). Форматы указаны там же, в документации. У вас хелп есть? Ну или хотя бы в инете смотрите...
|
|
|
|
|
May 13 2009, 18:32
|
Гуру
     
Группа: Свой
Сообщений: 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' Опять ругается. Что опять не так? Кажется понял. Ей нужна точка, а у меня запятая. Что делать?
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
May 13 2009, 18:45
|

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

|
Открываем хелп, видим: Цитата AnsiString::ToDouble
double __fastcall ToDouble() const; 0) Функция ToDouble принадлежит классу AnsiString; 1) Формальных параметров у функции нет. число = строка_с_числом.ToDouble() Вы же все делаете наоборот, поэтому компилятор справедливо говорит что отдельно взятой функции ToDouble он не знает, а до анализа аргумента функции дело не доходит. PS: разделитель целой и дробной части числа зависит от системной локали и учитывается автоматически. В русском зпт, в латинице тчк...
|
|
|
|
|
Oct 1 2009, 12:42
|

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

|
Можно так Код 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;
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|