2015-11-26 5 views
-4
std::streampos size; 
char * memblock; 

std::ifstream input ("A.JPG", std::ios::in|std::ios::binary|std::ios::ate); 

if (input.is_open()) 
{ 
    size = input.tellg(); 
    memblock = new char [size]; 
    input.seekg (0, std::ios::beg); 
    input.read (memblock, size); 
    input.close(); 

    std::cout << "[INPUT]the entire file content is in memory " << sizeof(memblock) << " \n"; 

} 
delete[] memblock; 

Я хотел бы использовать ifstream для чтения A.JPG (28KB) и сохранить его в массиве memblock. Но почему размер memblock равен 4 вместо 28403, а размер переменной равен 28403?Чтение двоичного файла в массив символов в C++

спасибо.

+0

Изменение 'SizeOf (memblock)' 'для SizeOf (* memblock)' ' –

+1

@RomanZaytsev SizeOf (* memblock) 'здесь не поможет. –

+0

@ πάντα ῥεῖ Можете ли вы подробно рассказать? Я думал, что этот случай равен http://stackoverflow.com/a/37539/5247040 –

ответ

0

Потому что memblock является указателем, поэтому оператор sizeof оценивает размер переменной указателя, которая составляет 4 байта.

+0

Спасибо за ваш ответ, но у меня недостаточно репутации на +1 ваш ответ :(Но в любом случае ваш ответ заставляет меня понять причину. – user44

0

Спасибо всем и, наконец, я использовал вместо этого вектор. Потому что, кажется, трудно отобразить результат я хочу (длина фактического массив символов)

std::vector <char> memblock(0); 
    if (input.is_open()) 
    { 
    size = input.tellg(); 
    //memblock = new char [size]; 
    memblock.resize(size); 
    input.seekg (0, std::ios::beg); 
    input.read (&memblock[0], size); 
    input.close(); 


    //std::cout << "[INPUT]the entire file content is in memory " << ((char *)(&memblock+1) - (char *)memblock)/(sizeof(memblock[0])) << " \n"; 
    std::cout << "[INPUT]the entire file content is in memory " << memblock.size() << " \n"; 
+0

Нет ничего плохого с этой версией, которая использует вектор, но это не ответ на ваш исходный вопрос. Вы сказали, что хотите прочитать jpeg в массив, вы не просили предложений относительно другого подхода. Ваш вопрос: «зачем размер из memblock 4 вместо 28403 », и вам был дан правильный ответ. В следующий раз, когда кто-то даст вам ответ, отметьте его как принятый. В конце концов, мы используем часть нашего свободного времени, чтобы помочь вам. –

+0

@Marko Popovic Извините за это, на самом деле я все еще хочу знать, как получить его длину. И это не Ответ может быть, и я просто хочу поделиться альтернативным способом достижения той же цели. Я думаю, что мой вопрос не очень хороший, я должен спросить, как получить длину, а не «почему». Но в любом случае, действительно спасибо за ваш комментарий и ответ. Я отмечу это как ответ, спасибо. – user44

Смежные вопросы