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);
            }   
        }               
    }


complete program

/**
 * copy.c
 *
 * Computer Science 50
 * Problem Set 5
 *
 * Copies a BMP piece by piece, just because.
 */
       
#include <stdio.h>
#include <stdlib.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>//for isdigit

#include "bmp.h"

int main(int argc, char* argv[])
{
    // ensure proper usage
    if (argc != 4)
    {
        printf("Usage: ./resize n infile outfile\n");
        return 1;
    }
    
    //checking if n is integer
    int i=0;
    string in=argv[1];
    while(in[i]!='\0')
    {
        if( isdigit(in[i]) )
        i++;
        
        else
        {
            printf("n, the resize factor, must be an integer.\n");
            return 5;
        }
    }
    
    int n=atoi(in);
    if(n<1 || n>100)
    {
        printf("n, the resize factor, must be a positive integer less than 100.\n");
        return 6;
    }
    
    
    // remember filenames
    char* infile = argv[2];
    char* outfile = argv[3];

    // open input file 
    FILE* inptr = fopen(infile, "r");
    if (inptr == NULL)
    
    {
        printf("Could not open %s.\n", infile);
        return 2;
    }

    // open output file
    FILE* outptr = fopen(outfile, "w");
    if (outptr == NULL)
    {
        fclose(inptr);
        fprintf(stderr, "Could not create %s.\n", outfile);
        return 3;
    }

    // read infile's BITMAPFILEHEADER
    BITMAPFILEHEADER bf;
    fread(&bf, sizeof(BITMAPFILEHEADER), 1, inptr);

    // read infile's BITMAPINFOHEADER
    BITMAPINFOHEADER bi;
    fread(&bi, sizeof(BITMAPINFOHEADER), 1, inptr);

    // ensure infile is (likely) a 24-bit uncompressed BMP 4.0
    if (bf.bfType != 0x4d42 || bf.bfOffBits != 54 || bi.biSize != 40 || 
        bi.biBitCount != 24 || bi.biCompression != 0)
    {
        fclose(outptr);
        fclose(inptr);
        fprintf(stderr, "Unsupported file format.\n");
        return 4;
    }
    
    // outfile's BITMAPFILEHEADER
    BITMAPFILEHEADER bf2=bf;
    
    // outfile's BITMAPINFOHEADER
    BITMAPINFOHEADER bi2=bi;    
        
    //multiplying width by n factor
    bi2.biWidth = n*(bi.biWidth);
    //multiplying height by n factor
    bi2.biHeight = n*(bi.biHeight);
    
    // determine padding for scanlines in outfile
    int padding =  (4 - (bi2.biWidth * sizeof(RGBTRIPLE)) % 4) % 4;
    
    // determine padding for scanlines in infile
    int padding_in =  (4 - (bi.biWidth * sizeof(RGBTRIPLE)) % 4) % 4;
    
        
    //size of the image
    bi2.biSizeImage = (bi2.biWidth + padding) * (abs(bi2.biHeight)) * 3;// positive bi2.biHeight for calculation of bi2.biSizeImage  
    
    //final size of bmp 
     bf2.bfSize = bi2.biSizeImage + 54;

    // write outfile's BITMAPFILEHEADER    
    
    fwrite(&bf2, sizeof(BITMAPFILEHEADER), 1, outptr);

    // write outfile's BITMAPINFOHEADER    
     
    fwrite(&bi2, sizeof(BITMAPINFOHEADER), 1, outptr);
    

    // 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);//padding_in is padding in inptr

        // then add padding to outfile
        for (int l = 0; l < padding; l++)//padding is padding in outptr
        {
            fputc(0x00, outptr);
        }        
        
        //flushing the buffer to outptr
        fflush(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 from outptr    
        for (int m = 0 ; m < bi2.biWidth ; m++)
        {             
            fread(&triplex[m], sizeof(RGBTRIPLE), 1 , outptr); 
        }
        
        //skip padding
        fseek(outptr, padding, SEEK_CUR);
        
        //writing the values in array to outptr n times
        for (int mn = 0 ; mn < n ; mn++)
        {
            //writing values from the array
            for (int o = 0 ; o < bi2.biWidth ; o++)
            {
                fwrite(&triplex[o], sizeof(RGBTRIPLE), 1 , outptr);   
            }
            //adding padding to outptr's scanline
            for (int p = 0; p < padding; p++)
            {
                fputc(0x00, outptr);
            }   
        }               
    }

    // close infile
    fclose(inptr);

    // close outfile
    fclose(outptr);

    // that's all folks
    return 0;
}