首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 读取2进制文件放到指定的内存空间中(答案满意的追加100分)在线等 [已结帖,结帖人:happyandsad]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • happyandsad
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-11-07 13:39:28 楼主
    如题...希望能具体点贴点代码
    200  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • vk2211
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-07 13:54:121楼 得分:30
    读取文件总是二进制的,看看MFC中的CFile类中的Open和Read成员函数吧
    C/C++ code
    BOOL CFile::Open(LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pException) { ASSERT_VALID(this); ASSERT(AfxIsValidString(lpszFileName)); ASSERT(pException == NULL || AfxIsValidAddress(pException, sizeof(CFileException))); ASSERT((nOpenFlags & typeText) == 0); // text mode not supported // shouldn't open an already open file (it will leak) ASSERT(m_hFile == INVALID_HANDLE_VALUE); // CFile objects are always binary and CreateFile does not need flag nOpenFlags &= ~(UINT)typeBinary; m_bCloseOnDelete = FALSE; m_hFile = INVALID_HANDLE_VALUE; m_strFileName.Empty(); TCHAR szTemp[_MAX_PATH]; if (lstrlen(lpszFileName) < _MAX_PATH) { if( AfxFullPath(szTemp, lpszFileName) == FALSE ) return FALSE; } else return FALSE; // path is too long m_strFileName = szTemp; // ASSERT(sizeof(HANDLE) == sizeof(UINT)); ASSERT(shareCompat == 0); // map read/write mode ASSERT((modeRead|modeWrite|modeReadWrite) == 3); DWORD dwAccess = 0; switch (nOpenFlags & 3) { case modeRead: dwAccess = GENERIC_READ; break; case modeWrite: dwAccess = GENERIC_WRITE; break; case modeReadWrite: dwAccess = GENERIC_READ | GENERIC_WRITE; break; default: ASSERT(FALSE); // invalid share mode } // map share mode DWORD dwShareMode = 0; switch (nOpenFlags & 0x70) // map compatibility mode to exclusive { default: ASSERT(FALSE); // invalid share mode? case shareCompat: case shareExclusive: dwShareMode = 0; break; case shareDenyWrite: dwShareMode = FILE_SHARE_READ; break; case shareDenyRead: dwShareMode = FILE_SHARE_WRITE; break; case shareDenyNone: dwShareMode = FILE_SHARE_WRITE | FILE_SHARE_READ; break; } // Note: typeText and typeBinary are used in derived classes only. // map modeNoInherit flag SECURITY_ATTRIBUTES sa; sa.nLength = sizeof(sa); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = (nOpenFlags & modeNoInherit) == 0; // map creation flags DWORD dwCreateFlag; if (nOpenFlags & modeCreate) { if (nOpenFlags & modeNoTruncate) dwCreateFlag = OPEN_ALWAYS; else dwCreateFlag = CREATE_ALWAYS; } else dwCreateFlag = OPEN_EXISTING; // special system-level access flags // Random access and sequential scan should be mutually exclusive ASSERT((nOpenFlags&(osRandomAccess|osSequentialScan)) != (osRandomAccess| osSequentialScan) ); DWORD dwFlags = FILE_ATTRIBUTE_NORMAL; if (nOpenFlags & osNoBuffer) dwFlags |= FILE_FLAG_NO_BUFFERING; if (nOpenFlags & osWriteThrough) dwFlags |= FILE_FLAG_WRITE_THROUGH; if (nOpenFlags & osRandomAccess) dwFlags |= FILE_FLAG_RANDOM_ACCESS; if (nOpenFlags & osSequentialScan) dwFlags |= FILE_FLAG_SEQUENTIAL_SCAN; // attempt file creation HANDLE hFile = ::CreateFile(lpszFileName, dwAccess, dwShareMode, &sa, dwCreateFlag, dwFlags, NULL); if (hFile == INVALID_HANDLE_VALUE) { if (pException != NULL) { pException->m_lOsError = ::GetLastError(); pException->m_cause = CFileException::OsErrorToException(pException->m_lOsError); // use passed file name (not expanded vesion) when reporting // an error while opening pException->m_strFileName = lpszFileName; } return FALSE; } m_hFile = hFile; m_bCloseOnDelete = TRUE; return TRUE; } UINT CFile::Read(void* lpBuf, UINT nCount) { ASSERT_VALID(this); ASSERT(m_hFile != INVALID_HANDLE_VALUE); if (nCount == 0) return 0; // avoid Win32 "null-read" ASSERT(lpBuf != NULL); ASSERT(AfxIsValidAddress(lpBuf, nCount)); DWORD dwRead; if (!::ReadFile(m_hFile, lpBuf, nCount, &dwRead, NULL)) CFileException::ThrowOsError((LONG)::GetLastError(), m_strFileName); return (UINT)dwRead; }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • happyandsad
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-07 14:16:312楼 得分:0
    哥们很感谢只是能不能说简单一点的啊...就一个简单的例子就行了呵呵
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • love_aiqiu_123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-07 14:28:093楼 得分:5
    接分
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • elephont9527
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-07 14:39:334楼 得分:10
    ifstream in("........",ios::binary);
    in.seekg(0,ios::end);
    int fileLen = in.tellg();
    char * add = new char[MAX];
    while(fileLen>0)
    {
    if(fileLen <=MAX)
    {
    in.read(add,fileLen);
    fileLen=0;
    }
    else
    {
    in.read(add,MAX);
    fileLen-=MAX;
    }
    //do something
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • suxpert
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-07 14:42:325楼 得分:10
    C/C++ code
    /* Such a simple example */ SOMETYPE buf; SOMETYPE * pTarget; if( NULL == ( fp = fopen("somefile", "rb") ) ){ exit(1); } fread(pTarget, nSize, nHowmany, fp); /* ... */ fclose(fp);

    OVER!

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • chary8088
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-07 14:51:586楼 得分:10
    二进制文件只能每次读取一个字节的,否则fread函数遇到'\0'会停止的
    char lsBuffer[1024];
    memset(lsBuffer, '\0', sizeof(lsBuffer));

    lpfp = fopen("file", "rb");
    用stat函数获取文件大小len
    fread(lsBuffer, 1, len, lpfp);

    这样就可以了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • chary8088
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-07 14:57:357楼 得分:30
    给LZ写了可用的代码
    C/C++ code
    char *lsBuffer = NULL; char *lpFile = "file.jpg"; lpfp = fopen(lpFile, "rb"); if(lpfp == NULL) return; struct stat stbuf; stat(lpFile, &stbuf); //用stat函数获取文件大小len int len = stbuf.st_size; lsBuffer = new char[len + 1]; memset(lsBuffer, '\0', len + 1); fread(lsBuffer, 1, len, lpfp); fclose(lpftp); //处理lsBuffer里的数据 delete []lsBuffer


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Arthur_
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-07 18:16:518楼 得分:30

    #include <stdio.h>
     
    #define MAX_LINE    40
     
    #define FILENAME "myfile.bin"
     
    typedef struct
    {
            int id;
            float x_coord;
            float y_coord;
            char name[MAX_LINE+1];
    } MY_TYPE_T;

    #define MAX_OBJECTS    3

    MY_TYPE_T objects;

    int main()
    {
            int i;
            FILE *fout;

    /* Open the output file */
            fout = fopen( FILENAME, "wb" );
            if (fout == (FILE *)0)
                    exit(-1);

    /* read into entire object’s structure */
            fread( (void *)objects, sizeof(MY_TYPE_T), 1, fout);

            fclose( fout );

            return 0;
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Demon__Hunter
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-07 18:44:499楼 得分:5
    先用楼上诸位所述的方法将内容读入缓冲区 然后调用WriteProcessMemory()写内存,楼主自己到msdn查下这个api的用法~~

    怀疑楼主有不良企图~~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Jacky_Dai
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-07 20:24:4810楼 得分:20
    C/C++ code
    // TODO: Place code here. FILE *fp; if((fp=fopen("\\saio\\user programs\\Zip.txt","r+" ))==NULL) { printf("Can not open file.\n"); } ////////////////////////////////////////// //把文件的位置指针移到文件尾 fseek(fp,0L,SEEK_END); //获取文件长度; long length=ftell(fp); /////////////////////////////////////////// // create a source buffer BYTE *source = (BYTE*)LocalAlloc(LPTR, length); BYTE *compressed = NULL; if (source == NULL) { return -1; } // the compress algorithm looks for repeat sequences, so generate data that has that srand(GetTickCount()); fseek(fp, 0L, SEEK_SET); fread(source, 1, length , fp); fclose(fp);
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kolige
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-08 00:53:2311楼 得分:0
    都说得很清楚了,也来学习学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • happyandsad
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-10 08:25:1912楼 得分:0
    感觉了大家说的很具体,小弟加100分大家分了啊呵呵谢谢
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • happyandsad
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-10 08:25:3213楼 得分:0
    感觉了大家说的很具体,小弟加100分大家分了啊呵呵谢谢
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hqin6
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-10 08:48:1214楼 得分:5
    jf~~~~~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • shinefree2004
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-10 10:32:2115楼 得分:5
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • henry3695
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-10 11:18:5416楼 得分:25
    C/C++ code
    //先把int nData[10];保存为二进制文件,后读出 #include "stdio.h" #include <stdlib.h> int average(char *pFilePath); void main() { FILE *fp; int nData[10]; for(int i=0;i<10;i++) { printf("请输入第%d个数:",i+1); scanf("%d",nData+i); } fp = fopen("c:\\data.txt", "wb");//b表示以二进制的形式写入文件 if(fp!=NULL) { fwrite(nData,sizeof(int),10,fp); fclose(fp); //写完文件后,可以看一下文件大小,40个字节, //其实就是数组的大小 sizeof(int)*10 = 40 以前在学校里没搞明白的问题,现在明白了 } printf("平均值大小:%d\n",average("c:\\data.txt") ); system("pause"); } int average(char *pFilePath) { int nData[10]={0}; FILE *fp; fp = fopen(pFilePath, "rb");//b表示以二进制的形式 if(fp!=NULL) { fread(nData,sizeof(int),10,fp); fclose(fp); } else { printf("读取文件出错了..."); return 0 ; } int nSum = 0 ; for(int i=0;i<10;i++) { printf("第%d个数:\t内存地址%8x\t值:%d\n",i+1,nData+i,*(nData+i)); nSum += *(nData+i) ; } return nSum/10; }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • redleaves
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-10 11:36:1417楼 得分:5
    分不少啊...接之..
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • waydream
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-10 12:04:4818楼 得分:10
    会读文件就行了!
    一定注意设置选项binary
    否则读不进来。
    读文件函数
    fopen()
    或者
    ifstream()
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved