3652|9

62

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

应用程序如何读出SD卡里面一个较大文件 [复制链接]

这个问题比较可笑吧。
可是我就是搞不定,
现在网上down下了一个例子程序,是读出SD卡的一个test.txt文件。
  1. BOOL CSDMMCDlg::OnInitDialog()
  2. {
  3.         CDialog::OnInitDialog();

  4.         // Set the icon for this dialog.  The framework does this automatically
  5.         //  when the application's main window is not a dialog
  6.         SetIcon(m_hIcon, TRUE);                                // Set big icon
  7.         SetIcon(m_hIcon, FALSE);                        // Set small icon
  8.        
  9.         CenterWindow(GetDesktopWindow());        // center to the hpc screen

  10.         // TODO: Add extra initialization here
  11.         [color=#FF0000]m_strFileName = "test.txt";        [/color]                // 文件名
  12.         UpdateData(FALSE);

  13.         return TRUE;  // return TRUE  unless you set the focus to a control
  14. }


  15. // "创建文件/打开文件" 按键单击事件代码
  16. void CSDMMCDlg::OnCreateFile()
  17. {
  18.         CString filename = "";
  19.         UpdateData(TRUE);

  20.         if (m_strFileName == "")
  21.         {
  22.                 MessageBox(_T("请输入文件名!"));
  23.                 return;
  24.         }
  25.        
  26.         // 取得文件名及路径
  27.         filename = _T("\\Storage Card\") + m_strFileName;

  28.         // 创建一个文件或打开一个文件
  29.         hFile = CreateFile(filename, GENERIC_READ | GENERIC_WRITE, 0,
  30.                                            NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  31.         if (hFile == INVALID_HANDLE_VALUE)
  32.         {
  33.                 MessageBox(_T("在SD/MMC卡上创建文件失败!"));
  34.                 return;
  35.         }

  36.         MessageBox(_T("成功创建/打开文件:") + filename);
  37. }

  38. // "读" 按键单击事件代码
  39. void CSDMMCDlg::OnReadfile()
  40. {
  41.         DWORD filelen,actlen;
  42.         char *pcharbuff;

  43.         if (hFile == INVALID_HANDLE_VALUE)
  44.         {
  45.                 MessageBox(_T("文件未打开!"));
  46.                 return;       
  47.         }
  48.        
  49.         filelen = GetFileSize(hFile, NULL);                                                        /* 获取文件大小 */
  50.         if (filelen == 0xFFFFFFFF)//文件为什么不能是4G?
  51.         {
  52.                 MessageBox(_T("获取文件大小失败!"));
  53.                 return;       
  54.         }

  55.         BOOL ret = SetFilePointer(hFile, 0, NULL, FILE_BEGIN);                /* 移动文件指针到文件开头 */       
  56.         if (ret == 0xFFFFFFFF)
  57.         {
  58.                 MessageBox(_T("将文件指针移至文件开头失败!"));
  59.                 return;       
  60.         }

  61.         pcharbuff = new char[filelen];
  62.         ret = ReadFile(hFile, pcharbuff, filelen, &actlen, NULL);        /* 从文件中读出数据 */
  63.         if (ret == TRUE)
  64.         {
  65.                 LPTSTR pStr = m_strDisp.GetBuffer(filelen);       
  66.                 // 将字节转化为 Unicode 字符串
  67.                 MultiByteToWideChar(CP_ACP, 0, pcharbuff, filelen, pStr, filelen);
  68.                 m_strDisp.ReleaseBuffer();
  69.                 UpdateData(FALSE);                                        /* 将读出的数据显示出来 */
  70.                 MessageBox(_T("读文件成功!"));       
  71.         }
  72.         else
  73.         {
  74.                 UpdateData(FALSE);
  75.                 MessageBox(_T("读文件失败!"));       
  76.         }

  77.         if (pcharbuff != NULL)
  78.                 delete[] pcharbuff;       
  79. }
复制代码


读txt等小文件是没有问题,但是当我把文件换成NK.nb0(30M)就读取失败了,怎么回事?
是不是new不能分配那么大的内存?
如果确实是这个原因,那应该怎么样做才能读出这么大的文件呢?
谢谢。

最新回复

CE5下面讲,分配30M的空间应该是大了一些,它的进程空间也才32M,太大了就要去共享空间了 除非是你所读取的数据需要很高的实时性,要放在RAM空间里,否则沒必要这样做,要多少读多少  详情 回复 发表于 2008-12-7 21:46
点赞 关注

回复
举报

75

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
new分配30M,肯定太多啦,一般都会失败,你的RAM多大啊,
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
SDRAM 64M
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

4
 
这个思路就不对,应该是分段读,不能一次全部读到内存中。
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 3 楼 91program 的回复:
这个思路就不对,应该是分段读,不能一次全部读到内存中。


一般多大一段呢?

wince这么差劲啊。我在网上找不到相关例子。91program 能不能再提示详细点。
如果用VirtualAlloc 这个呢?有人说这个可以申请大的虚拟内存的
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

6
 
估计大的文件要进行压缩,这样才好操作
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

7
 
估计大的文件要进行压缩,这样才好操作
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

8
 
这个贴子我就接分了
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 4 楼 gooogleman 的回复:
引用 3 楼 91program 的回复:
这个思路就不对,应该是分段读,不能一次全部读到内存中。


一般多大一段呢?

wince这么差劲啊。我在网上找不到相关例子。91program 能不能再提示详细点。
如果用VirtualAlloc 这个呢?有人说这个可以申请大的虚拟内存的


这个申请的空间,一般不能太大。具体要看系统,通常在10K左右,当然也可以更大。
但对于程序处理来说,大一些、小一点,都不影响实现的过程。
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

10
 
CE5下面讲,分配30M的空间应该是大了一些,它的进程空间也才32M,太大了就要去共享空间了
除非是你所读取的数据需要很高的实时性,要放在RAM空间里,否则沒必要这样做,要多少读多少
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
【干货上新】电源解决方案和技术第二趴 | DigiKey 应用探索站
当月好物、电源技术资源、特色活动、DigiKey在线实用工具,干货多多~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 2

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表