Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие _ как сохранить в файл?

Автор: deex 2.7.2010, 11:42

использую curl, чтобы скачать картинку
он вызывает внешнюю функцию для записи в файл

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &write);

в оригинале она записывает данные в файл через fwrite()

решил переписать на Qt:

static size_t write(void *buffer, size_t size, size_t nmemb, void *stream)
{
QFile file("test.png");
file.open(stderr, QIODevice::WriteOnly);

file.write(buffer, size * sizeof(float));
file.close();

return;
}


1. file.write не хочет принимать void *buffer. что это вообще такое?
2. просто уточнить - curl вызывает эту функцию один раз? или по мере скачивания файла, дописывая полученные данные?
3. что вернуть в ретурн, чтобы был size_t

ps заодно, прошу прояснить для меня что вообще такое size_t
частно вижу его, но в стандартных типах его нет. зачем его используют и почему пишут именно t?

Автор: Алексей1153 2.7.2010, 15:35

а так

static size_t write(void *buffer, size_t size, size_t nmemb, void *stream)
{
QFile file("test.png");
file.open(stderr, QIODevice::WriteOnly);

size_t t=file.write((char*)buffer, size);
file.close();

if(t<0) return 0;

return t
}



size_t - обычно это

typedef int size_t


Автор: DEADHUNT 2.7.2010, 15:41

лучше как-то так:

static size_t write(void *buffer, size_t size, size_t nmemb, void *stream)
{
    std::ofstream stream("test.png");
    if (!stream)
        return 0;
    size_t n = size * sizeof(float);
    stream.write((unsigned char*) buffer, n);
    stream.close();
    if (stream.bad())
        return 0;
    return n;
}

Автор: Алексей1153 2.7.2010, 15:48

А вот тут автору надо уточнить
size_t n = size * sizeof(float);

может, size - это уже размер в байтах (как у белых людей принято) ?

Автор: deex 3.7.2010, 20:11

спасибо, но повторю ещё раз:

- я хочу переписать на Qt
- что такое void *buffer -- почему его можно записывать в файл и почему оно void?
- что за тип size_t ? зачем он нужен?

ещё раз достигнутое:

static size_t write(void *buffer, size_t size, size_t nmemb, void *stream)
{
QFile file("test.png");
file.open(stderr, QIODevice::WriteOnly);

size_t result = file.write((const char *) buffer, size);
file.close();

return result;
}


на данный момент вылетает и я не очень понимаю как в QtCreator отследить ошибку

Автор: Алексей1153 3.7.2010, 20:22

Цитата(deex @ 3.7.2010, 23:11) *
что такое void *buffer

Удивляешь... В языках C/C++ void - это пустой тип. Указатель на void - указатель на любой тип (поэтому необходимо в нагрузку знать размер элемента плюс размер массива, или же размер массива в байтах сразу)

В данном случае buffer - буфер с данными, а size (как я полагаю) - размер буфера в байтах

Цитата(deex @ 3.7.2010, 23:11) *
почему его можно записывать в файл

записать в файл можно что угодно.

Цитата(deex @ 3.7.2010, 23:11) *
что за тип size_t ? зачем он нужен?

чисто блажь разработчиков. Мысленно считай его типом int

Цитата(deex @ 3.7.2010, 23:11) *
на данный момент вылетает и я не очень понимаю как в QtCreator отследить ошибку

в какой момент вылетает ? Запустить под отладкой и поставить точку останова в начале функции
static size_t write(void *buffer, size_t size, size_t nmemb, void *stream)

Потом шагать по строчке

Автор: DIMEDROLL 6.7.2010, 8:16

size_t это не int, a unsigned int, максимальное значение на 32битной системе = 4 ГБ
size_t - это тип-размер, используется для индексации массивов например, указания размера массивов и т.п.

Автор: Алексей1153 6.7.2010, 9:28

Цитата(DIMEDROLL @ 6.7.2010, 11:16) *
size_t это не int, a unsigned int, максимальное значение на 32битной системе = 4 ГБ

Один хрен, назвать как угодно можно :) Главное - смысл. А знаковый/не знаковый легко приводится

Даже если предположить, что это знаковое, всё равно массивов с таким индексом вряд ли встретишь. Даже если это массив байтов

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)