Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > AnsiString в бинарный файл


Автор: Gleb 11.7.2005, 15:46
Уважаемые, облазил почти все - нигде не нашел, как AnsiString сохранять и читать из бинарного файла с помощью ifstream и ofstream. Возможно ли такое в принципе?
Пробовал приводить к массиву символов, но появляется мусор на месте последнего символа в читаемой строке, да и сохраняется не в бинарном виде.

Автор: Дрон 11.7.2005, 16:02
Gleb
Этот вопрос нужно в раздел по C++ Builder писать.

Но насколько я помню такой возможности там нет.

Цитата(Gleb @ 11.7.2005, 16:46)
да и сохраняется не в бинарном виде

А в каком ещё виде оно может сохраняться?

Автор: Gleb 11.7.2005, 16:16
тогда хоть подскажите какой-нибудь метод не низкоуровневый попроще. Буду очень признателен.
Дрон, если приводить к массиву символов, то сохраняется в обычном текстовом виде, по крайней мере так происходит у меня smile

Автор: Earnest 11.7.2005, 16:27
А что такое AnsiString? Это не массив байтов по сути? Для анси-символов что "обычный текстовый" вид, что бинарный - разве что символ конца строки будет другой... А вы, случайно, не в текстовом режиме ifdtream и ofstream открываете?

Автор: Gleb 11.7.2005, 16:44
нет, открываю с ios::binary

Автор: vadims 11.7.2005, 16:48
метод c_str() формирует из AnsiString массив типа char

те
copy(buf, Str.c_str() );

получил из AnsiString Str -> char buf[]
единственное что надо подумать о размере буфера - например

buf = new(Str.Length)

Автор: Дрон 11.7.2005, 16:59
vadims
А strcpy уже отменили? smile smile

Автор: ДмитрийПП 11.7.2005, 17:03
Код

ofstream ofs;
ofs.open("test.dat", ios_base::out | ios_base::binary );
ofs << Caption.c_str() << '\0';
ofs.close();  

Где Caption - AnsiString заголовок окна. Просто используй функцию c_str(). Прочитать тоже не очень сложно.

Автор: Gleb 11.7.2005, 17:24
Код

    AnsiString str = "Hello World";
    char *string = new char[str.Length()];
    strcpy(string, str.c_str());

    ofstream file("data.db",ios::binary);
    file.write(string,sizeof(char)*str.Length());
    file.close();

    delete[] string;


В итоге 11 байт и строчка "Hello World"

Автор: vadims 11.7.2005, 17:35
Дрон
Ну перегрелся я smile у себя никак ошибку в простейших вычислениях найти не могу - кто бы подсказал а то глаз замылился - а в форум выкладывать не хочу - засмеете smile


Gleb
Если тебе надо просто записать- можно еще проще, без буферов и копирований

AnsiString str = "Hello World";

ofstream file("data.db",ios::binary);
file.write(str.c_str(),sizeof(char)*str.Length());
file.close();


Автор: Vyacheslav 11.7.2005, 18:14
А чем не устроили операторы AnsiString << и >> ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)