ファイルは出力されるものの、出力されたファイルが破損しているらしく開くことができません。
エラー等も出ないのでどこを直せばいいのか分かりません。
プログラミングを始めたばかりで理解が追い付いていないためおかしな点が多々あると思いますが、どうか教えていただければと思います。
以下コードです。
 
#include<stdio.h>
#include<stdlib.h>
typedef struct {
	unsigned short  bfType;
	unsigned long   bfSize;
	unsigned short  bfReserved1;
	unsigned short  bfReserved2;
	unsigned long   bfOffBits;
} BITMAPFILEHEADER;
typedef struct {
	unsigned long   biSize;
	long            biWidth;
	long            biHeight;
	unsigned short  biPlanes;
	unsigned short  biBitCount;
	unsigned long   biCompression;
	unsigned long   biSizeImage;
	long            biXPixPerMeter;
	long            biYPixPerMeter;
	unsigned long   biClrUsed;
	unsigned long   biClrImportant;
} BITMAPINFOHEADER;
typedef struct {
	unsigned char rgbBlue;
	unsigned char rgbGreen;
	unsigned char rgbRed;
	unsigned char rgbReserved;
} RGBQUAD;
typedef struct {
	BITMAPFILEHEADER    bitmapFileHeader;
	BITMAPINFOHEADER    bitmapInfoHeader;
	RGBQUAD             rgbQuad[256];
	unsigned char       *imageData;
} BMPINFO;
int readBMP(char* filename, BMPINFO* bmpInfo);
int writeBMP(char* filename, BMPINFO* bmpInfo);
int readBMP(char* filename, BMPINFO* bmpInfo) {
	FILE *fp;
	if ((fopen_s(&fp, filename, "rb")) != 0)
		printf("ファイルを開けませんでした\n");
	return -1;
	// BITMAPFILEHEADER/bfType読み込み
	fread_s(&bmpInfo->bitmapFileHeader.bfType, sizeof(unsigned short), sizeof(unsigned short), 1, fp);
	// BMPであることを確認
	if (bmpInfo->bitmapFileHeader.bfType != 0x4d42)
		return -2;
	// その他情報を読み込む
	fread_s(&bmpInfo->bitmapFileHeader.bfSize, sizeof(unsigned long), sizeof(unsigned long), 1, fp);        // bfSize
	fread_s(&bmpInfo->bitmapFileHeader.bfReserved1, sizeof(unsigned short), sizeof(unsigned short), 1, fp); // bfReserved1
	fread_s(&bmpInfo->bitmapFileHeader.bfReserved2, sizeof(unsigned short), sizeof(unsigned short), 1, fp); // bfReserved2
	fread_s(&bmpInfo->bitmapFileHeader.bfOffBits, sizeof(unsigned long), sizeof(unsigned long), 1, fp);     // bfOffBits
	// BITMAPINFOHEADER読み込み
	fread_s(&bmpInfo->bitmapInfoHeader, sizeof(BITMAPINFOHEADER), sizeof(BITMAPINFOHEADER), 1, fp);
	// BMPINFOHEADERの種類を確認
	long test = bmpInfo->bitmapInfoHeader.biSize;
	if (bmpInfo->bitmapInfoHeader.biSize != 40) 
		return -3;
	// カラーテーブル取得
	fread_s(&bmpInfo->rgbQuad, sizeof(RGBQUAD) * 256, sizeof(RGBQUAD), 256, fp);
	// 画像データ格納用領域確保
	bmpInfo->imageData = (char*)malloc(sizeof(char) * bmpInfo->bitmapInfoHeader.biWidth * bmpInfo->bitmapInfoHeader.biHeight);
	// 画像データ取得
	fread_s(&bmpInfo->imageData,
		bmpInfo->bitmapInfoHeader.biWidth * bmpInfo->bitmapInfoHeader.biHeight,
		sizeof(char),
		bmpInfo->bitmapInfoHeader.biWidth * bmpInfo->bitmapInfoHeader.biHeight,
		fp);	
	fclose(fp);
	return 0;
}
	
int writeBMP(char* filename, BMPINFO* bmpInfo){
	FILE *fp;
	if ((fopen_s(&fp, filename, "w+b")) != 0)
		return -1;
	// BMPファイル書き出し
	fwrite(&bmpInfo->bitmapFileHeader.bfType, sizeof(unsigned short), 1, fp);
	fwrite(&bmpInfo->bitmapFileHeader.bfSize, sizeof(unsigned long), 1, fp);
	fwrite(&bmpInfo->bitmapFileHeader.bfReserved1, sizeof(unsigned short), 1, fp);
	fwrite(&bmpInfo->bitmapFileHeader.bfReserved2, sizeof(unsigned short), 1, fp);
	fwrite(&bmpInfo->bitmapFileHeader.bfOffBits, sizeof(unsigned long), 1, fp);
	fwrite(&bmpInfo->bitmapInfoHeader, sizeof(BITMAPINFOHEADER), 1, fp);
	fwrite(&bmpInfo->rgbQuad, sizeof(RGBQUAD), 256, fp);
	fwrite(&bmpInfo->imageData, 
		sizeof(unsigned char), 
		bmpInfo->bitmapInfoHeader.biWidth * bmpInfo->bitmapInfoHeader.biHeight, 
		fp);
	fclose(fp);
	return 0;
}
int main() {
	char rFilename[64] = "test.bmp";
	char wFilenmane[64] = "test_.bmp";
	BMPINFO bitmapInfo;
	readBMP(rFilename, &bitmapInfo);
	writeBMP(wFilenmane, &bitmapInfo);
	return 0;
}