C函数fopen和fopen_s函数打开文件丢失字节

#include "PETools.h"
//获取文件大小
DWORD  GetFileSize(FILE* rFile)
{
    DWORD lenth;
    fseek(rFile, 0, SEEK_END);
    lenth = ftell(rFile);
    fseek(rFile, 0, SEEK_SET);
    return lenth;
}
//读取文件,返回读取文件存放的指针
LPVOID ReadFile(LPCSTR lpszFile)
{
    FILE*    rFile;
    //文件长度
    DWORD    lenth;
    //读取到的文件大小
    DWORD   rSize;
    //文件读取到的buffer
    LPVOID    pFileBuffer = NULL;
    //rFile = fopen(lpszFile, "rb");
    //rFile = fopen(lpszFile, "r+");
    //fopen_s(&rFile,lpszFile, "r+");
    fopen_s(&rFile,lpszFile, "rb");
    if (!rFile)
    {
        printf("打开文件失败");
        return NULL;
    }

    lenth = GetFileSize(rFile);

    //分配内存空间
    pFileBuffer = malloc(lenth);
    if (!pFileBuffer)
    {
        printf("分配内存空间失败");
        fclose(rFile);
        free(pFileBuffer);
        return NULL;
    }

    //读取rFile的值
    rSize = fread_s(pFileBuffer, lenth, 1, lenth, rFile);
    if (!rSize)
    {
        printf("读取文件失败");
        fclose(rFile);
        free(pFileBuffer);
        return NULL;
    }
    fclose(rFile);
    return pFileBuffer;
}

//打印所有的文件信息
VOID   PrintFileInfo(LPCSTR lpszFile)
{
    LPVOID pFileBuffer = NULL;
    //Dos 头结构体
    PIMAGE_DOS_HEADER pDosHeader;
    //NT   头结构体
    PIMAGE_NT_HEADERS32 pNtHeader;
    //PE头
    PIMAGE_FILE_HEADER  pPeHeader;
    //可选PE头结构体
    PIMAGE_OPTIONAL_HEADER32 pOptionHeader;
    pFileBuffer = ReadFile(lpszFile);
    if (!pFileBuffer)
    {
        printf("读取文件失败\n");
        return;
    }
    //判断是否是有效的MZ标志
    if (IMAGE_DOS_SIGNATURE != *(PWORD)pFileBuffer)
    {
        printf("不是有效的MZ标志\n");
        free(pFileBuffer);
        return;
    }
    pDosHeader = (PIMAGE_DOS_HEADER)pFileBuffer;
    //打印Dos头
    printf("********************DOC头********************\n");
    printf("MZ标志:%x\n", pDosHeader->e_magic);
    printf("PE偏移:%x\n", pDosHeader->e_lfanew);

    //判断是否是有效的PE标志
    if (*((PDWORD)((DWORD)pFileBuffer + pDosHeader->e_lfanew)) != IMAGE_NT_SIGNATURE)
    {
        printf("不是有效的PE标志\n");
        free(pFileBuffer);
        return;
    }
    //打印NT 头信息
    pNtHeader = (PIMAGE_NT_HEADERS32)((DWORD)pFileBuffer + pDosHeader->e_lfanew);
    printf("********************NT头********************\n");
    printf("NT:%x\n", pNtHeader->Signature);
    pPeHeader = (PIMAGE_FILE_HEADER)((DWORD)pNtHeader + 4);
    printf("********************PE头********************\n");
    printf("Machine:%x\n", pPeHeader->Machine);
    printf("NumberOfSections:%x\n", pPeHeader->NumberOfSections);
    printf("SizeOfOptionalHeader:%x\n", pPeHeader->SizeOfOptionalHeader);
    pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)((DWORD)pPeHeader + IMAGE_SIZEOF_FILE_HEADER);
    printf("********************OPTIOIN_PE头********************\n");
    printf("Magic:%x\n", pOptionHeader->Magic);
    printf("AddressOfEntryPoint:%x\n", pOptionHeader->AddressOfEntryPoint);
    printf("ImageBase:%x\n", pOptionHeader->ImageBase);
    printf("SectionAlignment:%x\n", pOptionHeader->SectionAlignment);
    printf("FileAlignment:%x\n", pOptionHeader->FileAlignment);
    printf("SizeOfImage:%x\n", pOptionHeader->SizeOfImage);
    printf("SizeOfHeaders:%x\n", pOptionHeader->SizeOfHeaders);
    //释放内存    
    free(pFileBuffer);

}

使用fopen和fopen_s函数打开文件,mode参数使用r+会丢失字节,使用rb解决不再丢失的问题

 

使用c++ 语法打开文件

1:头文件

#include <fstream>
using namespace std;

LPVOID ReadFileByCPlus(LPCSTR lpszFile)
{
    LPVOID pFileBuffer = NULL;

    //ifstream ifs(lpszFile);    //使用这个构造函数,读取数据会丢失
    ifstream ifs(lpszFile, ios::binary | ios::in);
    if (!ifs.is_open())
    {
        printf("打开文件失败 \n");
        return NULL;
    }
    //计算长度
    ifs.seekg(0, ios::end);
    DWORD lenth = ifs.tellg();
    ifs.seekg(0, ios::beg);
    pFileBuffer = malloc(lenth);
    ifs.read((char*)pFileBuffer, lenth);

    ifs.close();
    return pFileBuffer;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值