Указатель C++ Char на массив char

Ни один из опубликованных ответов, которые я читал, не работает, поэтому я спрашиваю еще раз.

Я пытаюсь скопировать данные string, на которые указывает указатель char, в массив char.

У меня есть функция, которая читает из ifstream в массив символов

char* FileReader::getNextBytes(int numberOfBytes) {
    char *buf = new char[numberOfBytes];

    file.read(buf, numberOfBytes);

    return buf;
}

Затем у меня есть структура:

struct Packet {
    char data[MAX_DATA_SIZE]; // can hold file name or data
} packet;

Я хочу скопировать то, что возвращается из getNextBytes(MAX_DATA_SIZE) в package.data;

EDIT: Позвольте мне показать вам, что я получаю со всеми ответами, полученными ниже (memcpy, strcpy, передача в качестве параметра). Я думаю, что ошибка откуда-то еще. Я читаю файл как двоичный (это png). Я буду зацикливаться, пока fstream хорош(), и читать из fstream в buf (который может быть массивом данных). Я хочу увидеть длину того, что я прочитал:

cout << strlen(packet.data) << endl;

Это возвращает каждый раз разные размеры: 8 529 60 46 358 66 156 После этого, по-видимому, не осталось байтов для чтения, хотя файл имеет длину 13 КБ + байт.


person Sotirios Delimanolis    schedule 01.03.2012    source источник
comment
или вы можете просто передать в getNextBytes указатель на package.data... тогда вы поместите данные прямо в него и избежите как создания постороннего массива символов, так и копирования.   -  person Justin Peel    schedule 01.03.2012
comment
что не сработало? вы пробовали strcpy или strncpy? правильно ли завершен ваш buf NULL?   -  person Naveen    schedule 01.03.2012
comment
Я попробовал оба из них, и да, buf правильно завершается NULL. Buf, возможно, на самом деле считывает двоичные данные из файла fstream.   -  person Sotirios Delimanolis    schedule 01.03.2012
comment
Если вам пришлось опубликовать повторно из-за отсутствия ответов или правильных решений, попробуйте присудить награду за вопрос.   -  person Rohit Vipin Mathews    schedule 01.03.2012


Ответы (3)


Это можно сделать с помощью стандартной библиотечной функции memcpy, которая объявлена ​​в /:

strcpy(packet.data, buf);

Для этого требуется, чтобы file.read возвращал правильную серию символов, которая заканчивается на «\ 0». Вы также можете убедиться, что numberOfBytes достаточно велико, чтобы вместить всю строку. В противном случае вы можете получить ошибку сегментации.

person myin528    schedule 01.03.2012

Редактировать:
Обрабатывается ли это как строка или нет, это очень важное различие. В своем вопросе вы назвали это «строкой», что и сбило нас всех с толку.


Без какой-либо помощи библиотеки:

char result = reader.getNextBytes(MAX_DATA_SIZE);
for (int i = 0; i < MAX_DATA_SIZE; ++MAX_DATA_SIZE) {
  packet.data[i] = result[i];
}
delete [] result;

Использование #include <cstring>:

memcpy(packet.data, result, MAX_DATA_SIZE);

Или для дополнительной оценки перепишите getNextBytes так, чтобы он имел выходной параметр:

char* FileReader::getNextBytes(int numberOfBytes, char* buf) {
  file.read(buf, numberOfBytes);

  return buf;
}

Тогда это просто:

reader.getNextBytes(MAX_DATA_SIZE, packet.data);

Правка 2.
Чтобы получить длину файла:

file.seekg (0, ios::end);
int length = file.tellg();
file.seekg (0, ios::beg);

И с этим в руках...

char* buffer = new char[length];
file.read(buffer, length);

Теперь у вас есть весь файл в buffer.

person Gunslinger47    schedule 01.03.2012
comment
Все получилось в итоге. Но здесь вы неправильно понимаете цель того, что я делаю. Если бы я мог, конечно, я бы отправил весь файл в одном пакете. Но мы хотим разбить его и отправить в виде фреймов, поэтому я передаю количество байтов для чтения (= MAX_DATA_SIZE). Но спасибо. - person Sotirios Delimanolis; 13.03.2012

strlen не является допустимым способом определения количества двоичных данных. strlen просто читает, пока не найдет '\0', не более того. Если вы хотите прочитать фрагмент двоичных данных, просто используйте std::vector, измените его размер на количество байтов, которые вы читаете из файла, и верните его как значение. Проблема решена.

person cooky451    schedule 01.03.2012