4263|9

49

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

读写SD卡中的一个文件 [复制链接]

我建了一个对话框
对话框上有两个编辑框
一个用来编辑写入文件的内容
一个用来显示读出文件的内容
还有两个按钮
一个按钮用来执行写入操作
一个按钮用来执行读取操作
——————————————————————————————
写入按钮的单击响应函数如下:
(如果所写入的文件不存在,则创建它)
(头文件中有定义:const LPCTSTR STUDENTFILEPATH = _T("\\SDMEM\\test.txt");)
        CFile stuFile;
        UpdateData(TRUE);
        if(stuFile.Open(STUDENTFILEPATH,CFile::modeRead | CFile::modeWrite))
        {
                stuFile.SeekToEnd();
                stuFile.Write(&m_send,sizeof(m_send));
                stuFile.Close();
        }
        else  //创建文件
        {
                if (stuFile.Open(STUDENTFILEPATH,CFile::modeCreate|CFile::modeWrite|CFile::modeRead))
                {
                        stuFile.SeekToEnd();
                        stuFile.Write(&m_send,sizeof(m_send));
                        stuFile.Close();
                }
                else
                {
                        AfxMessageBox(_T("新建test.txt文件失败!"));
                }
        }
读取按钮的单击响应函数如下:
        CFile stuFile;
        if(stuFile.Open(STUDENTFILEPATH,CFile::modeRead | CFile::modeWrite))
        {
                stuFile.SeekToBegin();
                stuFile.Read(&m_rec,sizeof(m_rec));
                UpdateData(false);
                stuFile.Close();
        }
        else  //创建文件
        {
                AfxMessageBox(_T("打开test.txt文件失败!"));
        }
——————————————————————————————————————————————
我现在的操作时,每次程序执行。
先在编辑框中输入一点字母,然后点击写入按钮
向SD卡中的test.txt文件写入内容
如果不存在这个文件,则先创建它,然后再写入
之后再点击读取按钮
读取显示test.txt文件中的内容
现在的问题是
在点击读取的时候出现如下提示:
Access to \SDMEM\test.txt was denied.
拒绝访问。
请大家帮忙看一下代码。
提示一下,到底是怎么回事。
多谢。

最新回复

void CSDFILEDlg::OnRead() {         // TODO: Add your control notification handler code here         DWORD filelen,actlen;         char *pcharbuff;         if (hFile == INVALID_HANDLE_VALUE)         {                 MessageBox(_T("文件未打开!"));                 return;                }                 filelen = GetFileSize(hFile, NULL);                                                        /* 获取文件大小 */         if (filelen == 0xFFFFFFFF)         {                 MessageBox(_T("获取文件大小失败!"));                 return;                }         BOOL ret = SetFilePointer(hFile, 0, NULL, FILE_BEGIN);                /* 移动文件指针到文件开头 */                if (ret == 0xFFFFFFFF)         {                 MessageBox(_T("将文件指针移至文件开头失败!"));                 return;                }         pcharbuff = new char[filelen];         ret = ReadFile(hFile, pcharbuff, filelen, &actlen, NULL);        /* 从文件中读出数据 */         if (ret == TRUE)         {                 LPTSTR pStr = m_strDisp.GetBuffer(filelen);                        // 将字节转化为 Unicode 字符串                 MultiByteToWideChar(CP_ACP, 0, pcharbuff, filelen, pStr, filelen);                 m_strDisp.ReleaseBuffer();                 UpdateData(FALSE);                                                                                /* 将读出的数据显示出来 */                 MessageBox(_T("读文件成功!"));                }         else         {                 UpdateData(FALSE);                 MessageBox(_T("读文件失败!"));                }         if (pcharbuff != NULL)                 delete[] pcharbuff;         }   详情 回复 发表于 2009-12-1 13:41
点赞 关注

回复
举报

77

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
补充:创建文件,写入文件时可以的
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
你试试修改代码

  1. //读取按钮的单击响应函数如下:
  2. CFile stuFile;
  3. if(stuFile.Open(STUDENTFILEPATH,CFile::modeRead | CFile::modeWrite))
复制代码


去掉CFile::modeWrite
也就是if(stuFile.Open(STUDENTFILEPATH,CFile::modeRead))

 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

4
 
谢谢楼上的兄弟,能说明一下为什么吗?
现在“Access to \SDMEM\test.txt was denied.”
这种情况已经不出现了
不过
stuFile.Read(&m_rec,sizeof(m_rec));
我将文件的内容读到m_rec变量中
它是编辑框的STring类型的变量
然后UpdateData(false);
更新编辑框显示
不过现在显示不出来test.txt文件中的内容
(我在PC端新建了test.txt文件,输入www.bluemcu.com
,然后拷贝到了SD卡的目录下)
请大侠指点。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

5
 
我觉得
CFile::modeRead   Opens the file for reading only.
CFile::modeReadWrite   Opens the file for reading and writing.
CFile::modeWrite   Opens the file for writing only.
所以理论上是没有CFile::modeRead | CFile::modeWrite,
你所有的CFile::modeRead | CFile::modeWrite,应该用CFile::modeReadWrite

你的m_rec是CString类型的吗?这样的操作我没有用过,,最好不要这样操作
你可以用
CFile ff;
...
DWORD dwFile = ff.GetLength;
BYTE *p = new BYTE[dwFile + 2]; //tchar 最后要有一个'\0'
memset(p, 0, dwFile + 2);
ff.Read(p, dwFile);
...

另,你一定要注意,文本文件的格式要是unicode的,否则应该是不能这样做的.

unicode 有文件头,好像是0xfeff,要跳过这个文件头.






 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

6
 
代理微软产品 wince 6.0 R3版本的开发工具,技术支持,LICENCE销售
科通通信,网站:WWW.COMTECH.COM.CN
联系人何先生:13631588186
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

7
 
各路大侠问题还是没有解决
遇到的问题如下:
——————————————————————————————
如果当前没有这个文件,那么第一次执行程序,程序可以成功创建
这个文件,并正确的写入数据(我发现每次写入的字节数均对),
而且有时候可以读出数据显示到编辑框上。
——————————————————————————————
我重写了读写按钮单击响应函数,我要达到的功能很简单,对话框上
我放置了两个编辑框,两个按钮。在输入编辑框中写入一串字符,点击
“写入”按钮,字符串被写入到一个文件中去。点击“读取”按钮,
字符串被读出,然后显示在读取编辑框中。代码如下:
注:m_rec,m_send分别是两个编辑框关联的String类型的变量
STUDENTFILEPATH是个常量,我头文件中声明的,是文件的一个路径
——————————————————————————————
读按钮单击响应函数:
        HANDLE hFile;
        DWORD length;
        DWORD dwBytesRead;
        m_rec = _T("");
        hFile = CreateFile(STUDENTFILEPATH,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
        if(hFile == INVALID_HANDLE_VALUE)
        {
                AfxMessageBox(_T("Open File Failed!"));
                return;
        }
        SetFilePointer(hFile,0,NULL,FILE_BEGIN);
        length=GetFileSize(hFile,NULL);
        if(ReadFile(hFile,&m_rec,length,&dwBytesRead,NULL) == FALSE)
        {
                AfxMessageBox(_T("Read File Failed!"));
                return;
        }
        CloseHandle(hFile);
        GetDlgItem(IDC_EDT_READ)->UpdateData(false);
写按钮单击响应函数:
        HANDLE hFile;
        DWORD dwBytesWrite;
        GetDlgItem(IDC_EDT_WRITE)->UpdateData(true);
        hFile = CreateFile(STUDENTFILEPATH,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
        SetFilePointer(hFile,0,NULL,FILE_END);
        if(WriteFile(hFile,&m_send,m_send.GetLength(),&dwBytesWrite,NULL) == FALSE)
        {
                AfxMessageBox(_T("Write File Failed!"));
                return;
        }
        CloseHandle(hFile);
        m_send=_T("");
        GetDlgItem(IDC_EDT_WRITE)->UpdateData(false);
——————————————————————————————
请大家指点,多谢。JOYZML(朱铭雷)
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

8
 
try
if(WriteFile(hFile,&m_send,m_send.GetLength(),&dwBytesWrite,NULL) == FALSE)
修改为
if(WriteFile(hFile,&m_send,m_send.GetLength() * sizeof(TCHAR),&dwBytesWrite,NULL) == FALSE)




 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

9
 
void CSDFILEDlg::OnWrite()
{
// TODO: Add your control notification handler code here

DWORD len,actlen;
char *pcharbuff;

if (hFile == INVALID_HANDLE_VALUE)
{
MessageBox(_T("文件未打开!"));
return;
}

UpdateData(TRUE);
len = m_strDisp.GetLength(); /* 取得输入字符串的长度 */

pcharbuff = new char[len];
LPTSTR pStr = m_strDisp.GetBuffer(len); /* 取得输入字符串的缓冲区指针 */

// 将 Unicode 的 CString 转换为 char 型
WideCharToMultiByte(CP_ACP, 0, pStr, len, pcharbuff, len, NULL, NULL);
m_strDisp.ReleaseBuffer();

BOOL ret = SetFilePointer(hFile, 0, NULL, FILE_BEGIN); /* 移动文件指针到文件开头 */
if (ret == 0xFFFFFFFF)
{
MessageBox(_T("将文件指针移至文件开头失败!"));
delete[] pcharbuff;
return;
}

ret = WriteFile(hFile, pcharbuff, len, &actlen, NULL); /* 将数据写入文件中 */
if (ret == TRUE)
MessageBox(_T("写文件成功!"));
else
MessageBox(_T("写文件失败!"));

if (pcharbuff != NULL)
delete[] pcharbuff;

}
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

10
 
void CSDFILEDlg::OnRead()
{
        // TODO: Add your control notification handler code here

        DWORD filelen,actlen;
        char *pcharbuff;

        if (hFile == INVALID_HANDLE_VALUE)
        {
                MessageBox(_T("文件未打开!"));
                return;       
        }
       
        filelen = GetFileSize(hFile, NULL);                                                        /* 获取文件大小 */
        if (filelen == 0xFFFFFFFF)
        {
                MessageBox(_T("获取文件大小失败!"));
                return;       
        }

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

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

        if (pcharbuff != NULL)
                delete[] pcharbuff;
       
}



 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

北京市海淀区中关村大街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
快速回复 返回顶部 返回列表