I'm able to resize a given *.bmp* horizontally, but the code for vertical resizing is not working. Here is my code for vertical expansion. 

    // resize vertically

    //move pointer to start of scanline of outptr
    fseek(outptr,  -3 * (bi2.biWidth + padding), SEEK_CUR);
        
    fgetpos (outptr,&pos);
        
    //an array of RGBTRIPLE to store one scanline
    RGBTRIPLE triple[bi2.biWidth + padding]; 
        
    //reading the already written first line    
    for (int p = 0 ; p < bi2.biWidth + padding; p++)
    { 
        fread(&triple[p], sizeof(RGBTRIPLE), 1, outptr); 
    }
    fgetpos (outptr,&pos);           
        
    //writing the copied array to outptr
    for (int k = 0 ; k < n; k++)
    {             
        for (int p = 0 ; p < bi2.biWidth + padding; p++)
             
            fwrite(&triple[p], sizeof(RGBTRIPLE), 1, outptr);   
                        
    }
      
This is executed after reading the first scanline of the original *bmp*. I used *gdb* to see the values of `triple`'s elements, but I found that they're all garbage values. 

Also when I check the position of the file position indicator in `outptr` using `fgetpos()`, I find it not changing!


----------


**Update:** here's my code after modifications

    // iterate over infile's scanlines
    fpos_t pos;
    for (int i = 0, biHeight = abs(bi.biHeight); i < biHeight; i++)
    {   
        // iterate over pixels in scanline
        fgetpos (outptr,&pos);
        for (int j = 0; j < bi.biWidth; j++)
        {
            // temporary storage
            RGBTRIPLE triple;            
            
            // read RGB triple from infile
            fread(&triple, sizeof(RGBTRIPLE), 1, inptr);
            
            // write RGB triple to outfile n times horizontally
            for (int k = 0 ; k < n; k++)
            {       
                fwrite(&triple, sizeof(RGBTRIPLE), 1, outptr);  
                           
            }
        }

        // skip over padding in infile, if any
        fseek(inptr, padding_in, SEEK_CUR);

        // then add padding to outfile
        for (int l = 0; l < padding; l++)
        {
            fputc(0x00, outptr);
        }        
       
        // resize vertically  
        //move pointer to start of scanline of outptr
        fsetpos( outptr, &pos );
        
        //an array of RGBTRIPLE to store one scanline
        RGBTRIPLE triplex[bi2.biWidth]; 
        
            
        //reading the already written first line    
        for (int m = 0 ; m < bi2.biWidth ; m++)
        {             
            fread(&triplex[m], sizeof(RGBTRIPLE), 1 , outptr); 
        }
        
        //skip padding
        fseek(outptr, padding, SEEK_CUR);
        for (int mn = 0 ; mn < n ; mn++)
        {
            //writing the copied array to outptr
            for (int o = 0 ; o < bi2.biWidth ; o++)
            {
                fwrite(&triplex[o], sizeof(RGBTRIPLE), 1 , outptr);   
            }
            for (int p = 0; p < padding; p++)
            {
                fputc(0x00, outptr);
            }   
        }               
    }