Форум: Форум C++Разное
Новые темы: 00
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проблема с типом string (запись в файл)
 
 автор: dima_s_d_s   (23.01.2008 в 12:35)   письмо автору
 
 

Есть переменная типа string, в неё записываю данные (более 15 символов), проблема возникает именно тогда когда записываем более 15 символов.
привожу пример кода:


#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main () {
string d;
cout<<"d.capacity() = " << d.capacity() << endl;
d="1234567890123456789";

ofstream out("test.dat");
out.write((char*)&d,sizeof(d));
out.close();
}



Изначально у стринга буфер равен 15 (d.capacity() ).
Как выйти из данной ситуации?
Как буфер сделать 128 ?
(пробовал d.resize(Значение) не помогает, в файл данные не записываются).

Заранее благодарен.

  Ответить  
 
 автор: cheops   (24.01.2008 в 05:16)   письмо автору
 
   для: dima_s_d_s   (23.01.2008 в 12:35)
 

Вообще тип string должен автоматически раздвигаться...

  Ответить  
 
 автор: dima_s_d_s   (24.01.2008 в 05:19)   письмо автору
 
   для: cheops   (24.01.2008 в 05:16)
 

Тогда почему из приведенного выше года выходит что данные не записываются?
Если стринг будет содержать до 15 символов то запись будет удачной, а если более 15 то данные не будут сохранены, как обойти это ограничение?

  Ответить  
 
 автор: Фитч   (24.01.2008 в 09:18)   письмо автору
 
   для: dima_s_d_s   (24.01.2008 в 05:19)
 


#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main () {
string d;
cout<<"d.capacity() = " << d.capacity() << endl;
d="1234567890123456789";

ofstream out("test.dat");
out.write(d.c_str(),d.size());
out.close();
}

  Ответить  
 
 автор: dima_s_d_s   (24.01.2008 в 11:17)   письмо автору
 
   для: Фитч   (24.01.2008 в 09:18)
 

Да, да. не спорю так можно, но таким образом out.write(d.c_str(),d.size());)
мы просто достаём буфер.
А как сделать работу при записи использую пример что я привел выше?
(при той записи всё работает если там находится до 15 символов)

  Ответить  
 
 автор: Фитч   (24.01.2008 в 12:22)   письмо автору
 
   для: dima_s_d_s   (24.01.2008 в 11:17)
 

Хм...у меня записывается столько, сколько я указываю, resize(128) тоже нормально работает:

 d="1234567890123456789assssssssssssssf dgfgfghfghjjghjhgkhj";
 d.resize(128);
 ofstream out("test.dat");
 out.write(d.c_str(),d.size());
 out.close();
}

Тогда содержимое файла test.dat будет:

1234567890123456789assssssssssssssf dgfgfghfghjjghjhgkhj

+ в конце еще будет много квадратиков, которые почему-то не копируются (null-char?) Итоговая длина записанных файлов будет 128 (проверял).
Конструкция:

sizeof(d);

Не подходит, т.к. она вернет размер объекта d в памяти, а он хранит лишь указатеь на строку.

Или вам надо сохранить сам объект?

  Ответить  
 
 автор: dima_s_d_s   (24.01.2008 в 15:19)   письмо автору
 
   для: Фитч   (24.01.2008 в 12:22)
 

Я же писал, так то оно будет работать.
Но я хочу чтоб писались данные именно так :

out.write((char*)&d,sizeof(d));


а не так:

out.write(d.c_str(),d.size());


В интернете нет толкового описания как это сделать.

  Ответить  
 
 автор: alsav22   (13.04.2012 в 15:25)   письмо автору
 
   для: dima_s_d_s   (24.01.2008 в 15:19)
 

sizeof(d) не имеет отношения к размеру строки. Это размер объекта string в байтах, и он от размера строки не зависит. Сколько байтов, зависит от компилятора. Чтобы узнать: cout << sizeof(string). Потом, (char*)&d к строке не имеет отношения. Это адрес объекта string (а не строки), явно приведённый к указателю на char. У меня такой код в файл кракозябы пишет. Сам объект string не содержит строку. Он содержит ИНФОРМАЦИЮ о строке (в частности, её размер(колличество символов), получаемый методом d.size(); указатель на строку, получаемый методом d.c_str() ) и методы для работы со строками. Capacity = 15 выделяется под пустую строку. Если строка становится больше 15, то capacity автоматически увеличивается до 31 и т.д.

  Ответить  
 
 автор: Вася   (11.04.2012 в 04:16)
 
   для: Фитч   (24.01.2008 в 09:18)
 

Спасибо

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования