|
|
|
| Есть переменная типа 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(Значение) не помогает, в файл данные не записываются).
Заранее благодарен. | |
|
|
|
|
|
|
|
для: dima_s_d_s
(23.01.2008 в 12:35)
| | Вообще тип string должен автоматически раздвигаться... | |
|
|
|
|
|
|
|
для: cheops
(24.01.2008 в 05:16)
| | Тогда почему из приведенного выше года выходит что данные не записываются?
Если стринг будет содержать до 15 символов то запись будет удачной, а если более 15 то данные не будут сохранены, как обойти это ограничение? | |
|
|
|
|
|
|
|
для: 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();
}
|
| |
|
|
|
|
|
|
|
для: Фитч
(24.01.2008 в 09:18)
| | Да, да. не спорю так можно, но таким образом out.write(d.c_str(),d.size());)
мы просто достаём буфер.
А как сделать работу при записи использую пример что я привел выше?
(при той записи всё работает если там находится до 15 символов) | |
|
|
|
|
|
|
|
для: 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 (проверял).
Конструкция:
Не подходит, т.к. она вернет размер объекта d в памяти, а он хранит лишь указатеь на строку.
Или вам надо сохранить сам объект? | |
|
|
|
|
|
|
|
для: Фитч
(24.01.2008 в 12:22)
| | Я же писал, так то оно будет работать.
Но я хочу чтоб писались данные именно так :
out.write((char*)&d,sizeof(d));
|
а не так:
out.write(d.c_str(),d.size());
|
В интернете нет толкового описания как это сделать. | |
|
|
|
|
|
|
|
для: 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)
| | Спасибо | |
|
|
|