C文件操作函数fscanf和fprintf的使用

时间:2023-01-28 08:41:10

    使用fscanf和fprintf主要对一些有特定格式的数据进行文件读写较为方便,需要注意的是在读取的时候fscanf会遇到空格、回车就停止读取。
    使用fprintf向文件中写入格式为<%d,%d,%d,%d,%ld>的内容,其实例代码如下:

bool Write_Msg(TMsg& msg)
{
if(NULL == g_pFile)
{
printf("NULL == g_pFile in func Write_Msg()\n");
return false;
}
fprintf(g_pFile,"<%d,%d,%d,%d,%ld>\n", msg.iIndex, msg.iType, msg.iCode, msg.iValue, msg.Time);
fflush(g_pFile);
return true;
}
可以在文件中写入下面格式的内容:
<0,0,0,0,0>
<1,0,0,0,0>
<2,1,60,1,9783410>
<3,1,60,0,9783510>
<4,1,60,0,9783510>
<5,1,60,0,9783510>
<6,1,60,0,9783510>
<7,1,60,0,9783510>
<8,1,60,0,9783510>
<9,1,60,0,9783510>
<10,1,60,0,9783510>

使用fscanf对上述格式文件的读取也非常方面,可以很方便的将文件的内容提取到出来,其实例代码如下:

bool Read_Msg(TMsg& msg)
{
if(NULL == g_pFile)
return false;
msg.iIndex = msg.iType = msg.iCode = msg.iValue = msg.Time = 0;
fscanf(g_pFile,"<%d,%d,%d,%d,%ld>\n", &msg.iIndex, &msg.iType, &msg.iCode, &msg.iValue, &msg.Time);
return true;
}
注意:使用fscanf的时候不要忘记使用取地址符号&

使用fscanf对整个文件处理可以参考如下写法,根据返回的数据长度判断是否读取到文件结尾:

do{
iRes = 0;
iRes = fscanf(m_pFile,"<%d,%d,%d,%d,%ld>\n", &Msg.iIndex, &Msg.iType, &Msg.iCode,&Msg.iValue, &Msg.ulTime);
if(5 == iRes)
{
//printf("------------------<%d,%d,%d,%d,%ld>\n", Msg.iIndex, Msg.iKeyType, Msg.iKeyCode, Msg.iKeyValue, Msg.ulTime);
m_MsgList.push_back(Msg);
}
}while(iRes > 0);

另外,其中打开与关闭文件的c代码类似如下


打开文件代码(写打开模式为w+,读取可用rt):

    if(NULL == g_pFile)
{
char fileName[64] = {0};
sprintf(fileName, "%s%s", TEST_RESULT_FILEPATH,FILENAME);
if((g_pFile = fopen(fileName,"w+")) == NULL)
{
printf("fail: fopen \n");
return false;
}
}
其中:TEST_RESULT_FILEPATH,FILENAME为自定义的两个文件路径和文件名字的宏
关闭文件:

   if(NULL != g_pFile)
{
fflush(g_pFile);
fclose(g_pFile);
g_pFile = NULL;
}