使用 CFile 的子类 CStdioFile 的注意事项

目前为止只用到了 ReadString,也了解了一下 WriteString。

由于程序需要,本来程序中是用的CFile, 但是需要逐行读取文件数据,所以谷歌找到了 ReadString 类 —— 继承于CFile,是CFile 的派生类

当使用 WriteString 往文件中存以行为单位的数据时,后面不要加 \r 或 \n,因为你已经告诉程序了,这是一行的数据,它会自动加上行符号。否则,当使用 ReadString 读取以 WriteString 存储的数据时,数据会多出一个 \r .

以下是个人使用。

CString strPath;
CString strRead;
TCHAR PathPro[256] = {0};
GetCurrentDirectoryW(256,PathPro);                    //PathPro: current dir path
strPath = CString(PathPro)+_T("\\") + SCRIPT_FILE_NAME;  //SCRIPT_FILE_NAME: "User_Script.txt"

CStdioFile f;  
CFileException e;  
if(!f.Open(strPath,CFile::modeRead) )
    return FALSE;  
while(f.ReadString(strRead))              //如果文件未读完,返回true,否则返回false。
{
    CString strTemp;
    strTemp.Format(_T("\n{{ %s }}"),strRead);    //检测是否成功读出每行数据
    LogToFiles(strTemp,0);
}
f.Close();

 

 


 

2018-11-02 新增笔记

 

昨天使用Open是因为不熟悉mode而浪费了时间,所以这里记录一下。

需求是文件如果存在则直接打开,文件如果不存在则新建。

一开始直接这样写的:

CString strPath, strReadLine;
TCHAR PathPro[256] = {0};
GetCurrentDirectoryW(256,PathPro);              //PathPro :current path
strPath = CString(PathPro)+_T("\\") + FileName; //strPath :absolute path

CStdioFile cfile;
cfile.Open(strPath,CFile::modeCreate|CFile::modeReadWrite);    
while(cfile.ReadString(strReadLine))
{
    ...
}

效果是文件如果存在则直接清空,后来又认真看了一下每种mode的用法。

modeCreate:以新建方式打开,如果文件不存在,新建;如果文件已存在,把该文件长度置零,即清除文件原有内容。

modeNoTruncate:以追加方式打开,如果文件存在,打开并且不将文件长度置零,如果文件不存在,会抛出异常。一般与CFile::modeCreate一起使用,则文件不存在时,新建一个文件;存在就进行追加操作。

modeReadWrite:以读写方式打开文件。

modeRead:只读。

modeWrite:只写。

换成这种方式打开就不会有问题了。

cfile.Open(strPath,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite);

实现效果是文件如果不存在则新建,如果存在则不清空文件以读写方式打开。

 

posted @ 2018-06-29 15:53  Janey91  阅读(230)  评论(0编辑  收藏  举报