void SaveGZMea_2_File(void) { static bool g_isSetGZM_File = TRUE; static FILE *tempfile; static LPTSTR sFileName = new TCHAR[30]; if(g_isSetGZM_File == TRUE) { SYSTEMTIME systime; GetSystemTime(&systime); wsprintf(sFileName, "D:\\CANPro\\GZSoluInfo_%u%02u%02u_%02u%02u.txt", systime.wYear, systime.wMonth, systime.wDay, systime.wHour+8, systime.wMinute); // "r+" 打开一个文本文件,文件必须存在,允许读写 // "w" 新建一个文本文件,已存在的文件将内容清空,只允许写 // "a" 打开或新建一个文本文件,只允许在文件末尾追写 // fopen:打开文件成功的话返回文件指针(赋值给fp) 打开失败则返回NULL值; // fopen_s:打开文件成功返回0,失败返回非0 if(NULL != fopen_s(&tempfile, (const char *)sFileName, "w")) { MessageBox(NULL,"Can not open GZMfile!","ERROR",MB_OK); return; } fprintf(tempfile, "%%Time\tState\tY1\tZ1\tX1\tY2\tZ2\tX2\r\n"); g_isSetGZM_File = FALSE; } else { if(NULL != fopen_s(&tempfile, (const char *)sFileName, "r+")) { MessageBox(NULL,"Can not open GZMfile!","ERROR",MB_OK); return; } fprintf(tempfile, "%%Time\tState\tY1\tZ1\tX1\tY2\tZ2\tX2\r\n"); } fclose(tempfile); }
时间: 2023-07-06 20:43:00 浏览: 92
delete_directory_file.rar_DeleteDirectory_delete file
这段代码的作用是将一些数据保存到文件中。在此过程中,它使用了一些指针和动态内存分配,因此需要特别注意内存泄漏和指针问题。
以下是一些需要注意的问题:
1. `sFileName`指针使用了动态内存分配,但没有在函数结束时释放。应该在函数末尾使用`delete[] sFileName`释放内存。
2. 在第一次调用函数时,会创建一个文件,并将`g_isSetGZM_File`标志设置为`FALSE`。但是,这个标志没有被使用,代码中还是在每次调用`SaveGZMea_2_File`函数时都会执行创建文件的代码。这会导致每次调用都会创建一个新文件并覆盖之前的文件。应该使用`g_isSetGZM_File`标志来控制文件创建的行为。
3. 使用`fopen`打开文件时,应该检查返回值是否为`NULL`,以判断文件是否成功打开。但是,在代码中使用了`fopen_s`函数,该函数返回值为`0`表示成功,非`0`表示失败,因此应该根据返回值是否为`0`来判断文件是否成功打开。
4. 在函数末尾,应该使用`fclose`关闭文件指针,以释放系统资源。
另外,代码中使用了`MessageBox`函数弹出错误信息框,这会阻塞程序并影响用户体验。建议使用日志文件等方式记录错误信息,以便在后续分析和调试中使用。
阅读全文