void CMyfileDlg::OnWrite() 
{
        //单字符串读写  包含中文和英文,接着增加多字符串
        CFile file;
file.Open("1.bin",CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
        int strlength =0;
CString str="单字符串读写  包含中文和英文00000asdasdw";
strlength = str.GetLength();
file.Write(&strlength,sizeof(int));
file.Write(str.GetBuffer(strlength),strlength);
str.ReleaseBuffer();
CString str1="单字符串读写  包含中文和英文1111111asdasdw";
strlength = str1.GetLength();
file.Write(&strlength,sizeof(int));
file.Write(str1.GetBuffer(strlength),strlength);
str1.ReleaseBuffer();
file.Close();
}
void CMyfileDlg::OnRead() 
{
        //单字符串读写  包含中文和英文,接着增加多字符串
        CFile file;
file.Open("1.bin", CFile::modeRead|CFile::typeBinary);
        CFile *pfile=&file;
while(pfile!=NULL)
{
int strlength =0;
CString str;
file.Read(&strlength,sizeof(int));
file.Read(str.GetBuffer(strlength),strlength);
MessageBox(str);
str="";
file.Read(&strlength,sizeof(int));
file.Read(str.GetBuffer(strlength),strlength);
MessageBox(str);
str.ReleaseBuffer();}
file.Close();
}
现象:在执行读的操作的时候,MessageBox正确显示了写入的两个字符串,但是接下来就弹出空对话框,且是死循环。
请问代码有什么问题。在CS同日那个进行读操作,需要在串的末尾加上'\0'吗

解决方案 »

  1.   

    最后file.Close(); ???
    那pfile估计永远是一个不确定值了...
      

  2.   

    ////pfile代表文件句柄.
    while(pfile!=NULL) 
    {
    }//用这个循环是错误的,判断条件永远有效.所以是死循环.
    int strlength =0; 
    CString str; 
    file.Read(&strlength,sizeof(int)); 
    file.Read(str.GetBuffer(strlength),strlength); 
    MessageBox(str); 
    str=""; 
    file.Read(&strlength,sizeof(int)); 
    file.Read(str.GetBuffer(strlength),strlength); 
    MessageBox(str); 
    str.ReleaseBuffer();} 
    file.Close(); 只需要这段代码就可以成功地读出文件的内容.再加上上面的错误的while循环,一方面文件句柄已经关闭,一方面读取文件的指针已经移到文件末尾无数据可读,所以会出现死循环+空的MessageBox 
      

  3.   

    首先str.ReleaseBuffer();} 这里有个括号,所以只有读取完成后才关闭文件,只是这个}没有换行,有点迷惑
    代码是要实现很多字符串的读写,举两个例子而已,而不是仅仅读写两个字符串。
      

  4.   

    或者是这样的读发了.void CMyfileDlg::OnRead()  

            //单字符串读写  包含中文和英文,接着增加多字符串 
            CFile file; 
    file.Open("1.bin", CFile::modeRead ¦CFile::typeBinary); 
            CFile *pfile=&file; 
    int count=0;
    do

      int strlength =0; 
     CString str; 
     count=file.Read(&strlength,sizeof(int)); 
     count=file.Read(str.GetBuffer(strlength),strlength); 
     MessageBox(str); 
     str.ReleaseBuffer(); 
    } while(Count >0)
    file.Close(); 
      

  5.   

    感谢5楼的帮助,用你的代码不会死循环但是还是多弹一个MESSAGEBOX出来。
    另外能否举一个用文件指针来实现的例子吗
      

  6.   

    一般都是按照可读取的字节数判断的。所以有时候会多读取一次了.下面是改良后的思路了,呵呵
    FILE* fp = NULL;
    // Open file
    fp = fopen(strFileName, "rb");
    if (fp == NULL)
    {
    return 
    }
    //
    #define MAX_DATABUF_LEN 1024
    char szDataBuf[MAX_DATABUF_LEN];
    size_t dwItem = 0; while (true)
    {
    dwItem = fread(szDataBuf, sizeof(char), MAX_DATABUF_LEN, fp);
    if (dwItem < MAX_DATABUF_LEN)
    {
    break;
    } }
    // Close file
    fclose(fp);
      

  7.   

    我看了下MSDN中CFILE没有向C语言中那种文件指针可以判断是否到了末尾。所以只好靠当前位置的来判断了。所以我就把代码改为了下面,实现了我的目标
            CFile file; 
           file.Open("1.bin", CFile::modeRead |CFile::typeBinary); 
            CFile *pfile=&file; 
    ULONGLONG filelength =file.GetLength();
    while(filelength>0)
    {
    int strlength =0; 
    CString str=""; ;
    file.Read(&strlength,sizeof(int)); 
    file.Read(str.GetBuffer(strlength),strlength); 
    MessageBox(str); 

    file.Read(&strlength,sizeof(int)); 
    file.Read(str.GetBuffer(strlength),strlength); 
    MessageBox(str); 
    str.ReleaseBuffer();
    filelength=filelength-file.GetPosition(); } 
    file.Close();