crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> как сохранить в файл?
deex
  опции профиля:
сообщение 2.7.2010, 11:42
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 45
Регистрация: 12.3.2009
Пользователь №: 608

Спасибо сказали: 0 раз(а)




Репутация:   0  


использую 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
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2901
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


а так
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



Сообщение отредактировал Алексей1153 - 2.7.2010, 15:39
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DEADHUNT
  опции профиля:
сообщение 2.7.2010, 15:41
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

Спасибо сказали: 26 раз(а)




Репутация:   2  


лучше как-то так:
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;
}


Сообщение отредактировал DEADHUNT - 2.7.2010, 15:42
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 2.7.2010, 15:48
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2901
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


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

может, size - это уже размер в байтах (как у белых людей принято) ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
deex
  опции профиля:
сообщение 3.7.2010, 20:11
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 45
Регистрация: 12.3.2009
Пользователь №: 608

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

- я хочу переписать на 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 отследить ошибку

Сообщение отредактировал deex - 3.7.2010, 20:13
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 3.7.2010, 20:22
Сообщение #6


фрилансер
******

Группа: Участник
Сообщений: 2901
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(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
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 165
Регистрация: 28.9.2008
Из: Киев
Пользователь №: 304

Спасибо сказали: 23 раз(а)




Репутация:   0  


size_t это не int, a unsigned int, максимальное значение на 32битной системе = 4 ГБ
size_t - это тип-размер, используется для индексации массивов например, указания размера массивов и т.п.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 6.7.2010, 9:28
Сообщение #8


фрилансер
******

Группа: Участник
Сообщений: 2901
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


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

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

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

Сообщение отредактировал Алексей1153 - 6.7.2010, 9:29
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 4.12.2020, 5:11