C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Загрузка и сохранение файла
mirk
Отправлено: 04.07.2003, 23:41


Ученик-кочегар

Группа: Участник
Сообщений: 10



Есть код:

lbTown->Items->LoadFromFile("data/br/town.br");
cbMkb->Items->LoadFromFile("data/br/mkb.br");
lbTown, cbMkb-Этo Memo
Загрузка идет при включении программы. Т.Е. это своебразные справочники(их порядка 20 штук, в каждом по 5-10 записей)

Есть новое окно(Настройка справочников)
При его включении эти файлы подгружаются в мемо поля там редактируются и сохраняются.
mTown->Items->LoadFromFile("data/br/town.br");
mMkb->Items->LoadFromFile("data/br/mkb.br");
mTown->Lines->SaveToFile("data/br/town.br");
mTown->Lines->SaveToFile("data/br/mkb.br");

При сохранении вылетает ошибка что не может создать файлы.

Подскажите плиз где косяк.

P/S/ Простите за чайниковский жаргон, начал программить всего месяц назад.


Admin
Отправлено: 05.07.2003, 09:09


Владимир

Группа: Администратор
Сообщений: 1190



Во-первых я не понял, как программа у Вас вообще компилится ??? wink.gif

Например вот этот код
QUOTE

lbTown->Items->LoadFromFile("data/br/town.br");
cbMkb->Items->LoadFromFile("data/br/mkb.br");
lbTown, cbMkb-Этo Memo


Насколько мне известно у TMemo нет свойства Items !!!
Ладно, допустим Вы спутали здесь Lines и Items

Далее:

QUOTE

mTown->Lines->SaveToFile("data/br/town.br");
mTown->Lines->SaveToFile("data/br/mkb.br");


Это что ? Вы сохраняете данные из одного компонента mTown
в 2 разных файла ? Так и задумано ? wink.gif

Теперь, когда вы хотите сохранить в файл SaveToFile("data/br/mkb.br");
вы уверены, что эта директория существует (весь этот путь),
если нет, то надо создать его например с помощью ForceDirectories()
и самое главное — такого пути не бывает,
бывает "c:\aaa\bbb\ccc\ddd" и т.д.

Например так:
CODE


// Save to File
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ForceDirectories("c:\\data\\br");
Memo1->Lines->SaveToFile("c:\\data\\br\\town.br");
}

//----------
// LoadFromFile
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Memo2->Lines->LoadFromFile("c:\\data\\br\\town.br");
}
//---------------------------------------------------------------------------



Или , например, относительно нашей папки нужно
создать \data\br\town.br

CODE

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString sDir = GetCurrentDir();
ForceDirectories(sDir+"\\data\\br");
Memo1->Lines->SaveToFile(sDir+"\\data\\br\\town.br");
}
//-----------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
AnsiString sDir = GetCurrentDir();
Memo2->Lines->LoadFromFile(sDir+"\\data\\br\\town.br");
}
//-----------------------------------------------------------

Pacifist
Отправлено: 11.08.2003, 01:10


Не зарегистрирован







Теперь, когда вы хотите сохранить в файл SaveToFile("data/br/mkb.br");
вы уверены, что эта директория существует (весь этот путь),
если нет, то надо создать его например с помощью ForceDirectories()
и самое главное — такого пути не бывает,
бывает "c:\aaa\bbb\ccc\ddd" и т.д.


Бывает такой путь, бывает!! В Linux, например... wink.gif
sprinter
Отправлено: 11.08.2003, 08:15


Ученик-кочегар

Группа: Участник
Сообщений: 14



И все же этот путь должен быть написан через двойной обратный слэш "\\" (или может необратный ). Или это подразумевалось? smile.gif
Георгий
Отправлено: 11.08.2003, 11:33


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



в строки языка C можно включать непечатные символы, например конец строки, табуляцию. Чтобы ввести символы, которые по определению нельзя напечатать символ "обратный слеш" был обьявлен служебным. Компилятор анализ строки выполняет так:
1. читает симвовы слева на право.
2. если символ не '\', то оставляет его как есть
3. если символ это '\', то анализирует следующий символ по такому алгоритму:
3.1 b — гудок — вставляется код — 0x07
3.2 r — возврат каретки — переход курсора на начало этой строки — 0x0D
3.3 t — символ горизонтальной табуляции — 0x09
3.4 n — перевод строки — переход на начало следующей строки — 0x0A
3.5 ххх — те символы расшифровку которых я не помню
3.6 число — итерпретируется как код символа
3.7 для всех остальных символов ( в том числе и '\') оставить как есть

Примеры:
строка как выглядит на экране
"asd\nasd" как 2 строки "asd"
"asd\rasd" как 1 строка "asd" (сначалы выводится первая, потом курсор на начало строки и выводится втораяЮ которая и затирает первыю)
"asd\\asd" asd\asd

поэтому, если надо, что бы в строке был символ '\', то его приходится писать 2 раза — первый проглатывается (как служебный), а второй остаётся (как не распознанный код).

Ах да — забыл добавить, что в оконных приложениях Windows большинство управляющих кодов не работают — гарантировано посмотреть их работу можно в DOS программах

Отредактировано Георгий — 11/08/2003, 14:29

Вернуться в Вопросы программирования в C++Builder