Re: Использование memcpy
От: Хреннос  
Дата: 16.12.13 14:37
Оценка: :)
Здравствуйте, IgorKr, Вы писали:

IK>Код:

IK>
IK>record *r=new record();
IK>int k=1;
IK>while(k<StringGrid1->RowCount)
IK>{
IK>    memcpy(r->n,StringGrid1->Cells[0][k].w_str(),sizeof(r->n));
IK>    memcpy(r->name,StringGrid1->Cells[1][k].w_str(),sizeof(r->name));
IK>    memcpy(r->s1,StringGrid1->Cells[2][k].w_str(),sizeof(r->s1));
IK>    memcpy(r->s2,StringGrid1->Cells[3][k].w_str(),sizeof(r->s2));
IK>        k++;
IK>        ...code...
IK>}
IK>


Здесь прекрасна каждая строка.

IK>Текст в r получается с нулями '\0' после каждого символа. Как скопировать без нулей ?


Для начала следует понять, что именно вы копируете, куда именно вы копируете, каков размер копируемых данных, и вообще — нужно ли вам именно копировать, а не преобразовывать из одного формата в другой.

Для начала:
1. Строковые объекты в С++ лучше всего копировать не через memcpy, а через присваивание.
2. sizeof(r->n) дает размер поля во время компиляции.
3. w_str(), скорее всего, возвращает строку в Юникоде.
Использование memcpy
От: IgorKr Украина  
Дата: 16.12.13 14:22
Оценка:
Код:
record *r=new record();
int k=1;
while(k<StringGrid1->RowCount)
{
    memcpy(r->n,StringGrid1->Cells[0][k].w_str(),sizeof(r->n));
    memcpy(r->name,StringGrid1->Cells[1][k].w_str(),sizeof(r->name));
    memcpy(r->s1,StringGrid1->Cells[2][k].w_str(),sizeof(r->s1));
    memcpy(r->s2,StringGrid1->Cells[3][k].w_str(),sizeof(r->s2));
        k++;
        ...code...
}

Текст в r получается с нулями '\0' после каждого символа. Как скопировать без нулей ?

16.12.13 18:36: Перенесено модератором из 'C/C++' — Кодт
..
Re: Использование memcpy
От: John1979  
Дата: 16.12.13 14:26
Оценка:
Здравствуйте, IgorKr, Вы писали:

начнем с того, что к C++ это не имеет никакого отношения.
закончим тем, что w_str отдает тебе юникод, если гугл не врет, то это строки C++ Builder'a и он имеет c_str() который отдаст тебе строку в ANSI, но русские символы потеряются скорее всего.
Re[2]: Использование memcpy
От: IgorKr Украина  
Дата: 16.12.13 15:24
Оценка:
Здравствуйте, Хреннос, Вы писали:

Х>Здравствуйте, IgorKr, Вы писали:


IK>>Код:

IK>>
IK>>record *r=new record();
IK>>int k=1;
IK>>while(k<StringGrid1->RowCount)
IK>>{
IK>>    memcpy(r->n,StringGrid1->Cells[0][k].w_str(),sizeof(r->n));
IK>>    memcpy(r->name,StringGrid1->Cells[1][k].w_str(),sizeof(r->name));
IK>>    memcpy(r->s1,StringGrid1->Cells[2][k].w_str(),sizeof(r->s1));
IK>>    memcpy(r->s2,StringGrid1->Cells[3][k].w_str(),sizeof(r->s2));
IK>>        k++;
IK>>        ...code...
IK>>}
IK>>


Х>Здесь прекрасна каждая строка.


IK>>Текст в r получается с нулями '\0' после каждого символа. Как скопировать без нулей ?


Х>Для начала следует понять, что именно вы копируете, куда именно вы копируете, каков размер копируемых данных, и вообще — нужно ли вам именно копировать, а не преобразовывать из одного формата в другой.


Х>Для начала:

Х>1. Строковые объекты в С++ лучше всего копировать не через memcpy, а через присваивание.
Х>2. sizeof(r->n) дает размер поля во время компиляции.
Х>3. w_str(), скорее всего, возвращает строку в Юникоде.


Как лучше присваивать UnicodeString в char ?
Re[3]: Использование memcpy
От: BlackEric http://black-eric.lj.ru
Дата: 16.12.13 16:43
Оценка:
Здравствуйте, IgorKr, Вы писали:

Х>>Для начала:

Х>>1. Строковые объекты в С++ лучше всего копировать не через memcpy, а через присваивание.
Х>>2. sizeof(r->n) дает размер поля во время компиляции.
Х>>3. w_str(), скорее всего, возвращает строку в Юникоде.


IK>Как лучше присваивать UnicodeString в char ?

Если char ansi, то возможно будет потеря данных. И наверное все-таки char*?
https://github.com/BlackEric001
Re: Использование memcpy
От: Mr.Delphist  
Дата: 27.12.13 10:09
Оценка:
Здравствуйте, IgorKr, Вы писали:

IK>Код:

IK>
IK>record *r=new record();
IK>int k=1;
IK>while(k<StringGrid1->RowCount)
IK>{
IK>    memcpy(r->n,StringGrid1->Cells[0][k].w_str(),sizeof(r->n));
IK>    memcpy(r->name,StringGrid1->Cells[1][k].w_str(),sizeof(r->name));
IK>    memcpy(r->s1,StringGrid1->Cells[2][k].w_str(),sizeof(r->s1));
IK>    memcpy(r->s2,StringGrid1->Cells[3][k].w_str(),sizeof(r->s2));
IK>        k++;
IK>        ...code...
IK>}
IK>

IK>Текст в r получается с нулями '\0' после каждого символа. Как скопировать без нулей ?

А нет ли у ячеек грида метода, аналогичного w_str(), но только для обычных строк? Например, str(), a_str(), c_str()? Билдера в досягаемости нет, сорри.

И как уже сказали выше, возможна потеря данных, если в ячейке лежат символы из разных локалей (т.к. преобразование wide char неизбежно будет приводить к какой-то одной локали — какой именно, надо смотреть сырцы грида).
Re: Использование memcpy
От: smeeld  
Дата: 27.12.13 16:43
Оценка:
Здравствуйте, IgorKr, Вы писали:

IK>Код:

IK>
IK>record *r=new record();
IK>int k=1;
IK>while(k<StringGrid1->RowCount)
IK>{
IK>    memcpy(r->n,StringGrid1->Cells[0][k].w_str(),sizeof(r->n));
IK>    memcpy(r->name,StringGrid1->Cells[1][k].w_str(),sizeof(r->name));
IK>    memcpy(r->s1,StringGrid1->Cells[2][k].w_str(),sizeof(r->s1));
IK>    memcpy(r->s2,StringGrid1->Cells[3][k].w_str(),sizeof(r->s2));
IK>        k++;
IK>        ...code...
IK>}
IK>

IK>Текст в r получается с нулями '\0' после каждого символа. Как скопировать без нулей ?
Зачем переводить в C тип для копирования? Манипуляции с string-ами лучше производить средствами C++.
В С++11 можно использовать крутяк copy_if(beg, end, dest, [](char c){return (c!='\0');})
Если нет, то string::value_type pos=str.find('\0'); str.copy(char* dest, pos,0);
В указатель на ANSI или Unicode char имхо нужно только при передачах массивов в функции с прототипами char* в определениях.
Re: Использование memcpy
От: lsv  
Дата: 10.02.14 05:06
Оценка:
IgorKr, не мучай людей догадками, напиши свою структуру record, чтобы четко было понятно, какой тип у параметров n, name, s1, s2.
И напиши, какой тип у тебя у StringGrid1->Cells, AnsiString или UnicodeString.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.