这是在对话框程序的pointscloud622Dlg.cpp文件中,开头应该包含这些头文件
#include "stdafx.h"
#include
#include "pointscloud622.h"
#include "pointscloud622Dlg.h"
#include "afxdialogex.h"
#include
using namespace std;
文件路径只识别正斜杠比如_T("H:/out/ys.txt"),不能识别系统窗口使用的反斜杠比如_T("H:\out\ys.txt")哦!
下面直接看打开按钮的响应函数:
void Cpointscloud622Dlg::OnBnClickedButton1()//点击打开文件
{
TCHAR szFilter[] = _T("点云文件(*.ply;*.pcd)||RBS_APP 文件 (.rbs_app)||文本文件(*.txt)||所有文件(*.*)||");//设置过滤器,双竖线结尾,单竖线隔开;
例如:有两个过滤规则,一个是图片文件:*.bmp或者*.jpg;另一个是所有文件:*.*。则过滤规则为:
" 图片文件 |*.jpg;*.bmp | 所有文件 | *.* ||"
CFileDialog fileDlg(TRUE, _T("txt"), NULL, 0, szFilter, this); // 构造打开文件对话框,第一个参数为false表示构造另存为对话框
if (IDOK == fileDlg.DoModal()) // 显示打开文件对话框
{
SetDlgItemText(IDC_EDIT1, fileDlg.GetPathName());//将地址输入到对话框界面的第一个编辑框中
CStdioFile file;//实例化一个文件对象用于读取信息
file.Open(fileDlg.GetPathName(), CFile::modeReadWrite);//打开上面的路径,读到我们想要了解的那个文件
CString temp;//用于存放每行读取的内容
//const char *charTemp;//用于存放每行读取的内容,char格式
CString status;//状态栏内容
while (file.ReadString(temp))//下面是对一个具体的点云文件读取操作,以后写代码作为参考即可
{
if (temp.Left(14) == CString("element vertex"))//如果最左边的14个字符是element vertex则停下
{
//string strTemp(CW2A(temp.GetString()));//将CString转化为string
//charTemp =strTemp.c_str();//将string转换为char *
sscanf_s(temp, "element vertex %d", &m_NumPoints);//取出点数
}
if (temp.Left(12) == CString("element face"))//如果最左边的12个字符是element face则停下
{
//string strTemp(CW2A(temp.GetString()));//将CString转化为string
//charTemp = strTemp.c_str();//将string转换为char *
sscanf_s(temp, "element face %d", &m_NumFace);//取出面数
break;//跳出
}
}
status.Format("本文件中共有%d个顶点,%d个单元面", m_NumPoints, m_NumFace);//状态栏
//下面开始写状态栏
RECT m_Rect;
GetClientRect(&m_Rect); //获取对话框的矩形区域
m_Rect.top = m_Rect.bottom - 20; //设置状态栏的矩形区域
m_StatBar->SetText(status, 0, 0);
关于MFC对话框状态栏的用法,详见https://blog.csdn.net/challenge_c_plusplus/article/details/6076584
file.Close();
}
}
//对于写入,思路是这样:首先拿到要写入的内容,存进一个CString类型的变量中;然后通过交互的方式拿到用户想要存取的位置和文件名;最后在指定路径创建文件并且将内容写入
//一、拿到要写入的内容,存进一个CString类型的变量中
CString outer="This is my first document\nHello world";
//二、通过交互的方式拿到用户想要存取的位置和文件名
TCHAR szFilter[] = _T("MEA 文件 (.mea)||文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||");//设置该对话框的文件过滤器
CFileDialog savefileDlg(FALSE, _T("txt"), strFileTitle, 0, szFilter, this);// 构造存储文件对话框,第三个参数是默认文件名
savefileDlg.m_ofn.lpstrFilter=_T("MEA Files(*.mea)\0*.mea\0RBS Files(*.rbs_app)\0*.rbs_app\0Text Files(*.txt)\0*.txt\0ALL Files(*.*)\0*.*\0\0");
if (IDOK == savefileDlg.DoModal())//打开保存对话框,通过与用户交互来拾取存储路径和文件名、后缀名
{
CString strFilePathSave = savefileDlg.GetPathName();//用于保存完整的存储路径,包括文件名、后缀名
CString str_saveFileTitle = savefileDlg.GetFileName();//保存用户在对话框中输入的文件名和后缀名
}
else
{
return;
}
// strFileTitle=str_saveFileTitle;
//三、在指定路径创建文件并且将内容写入
CStdioFile myoutfile;
myoutfile.Open(strFilePathSave, CFile::modeReadWrite | CFile::modeCreate | CFile::modeNoTruncate);//计算机内部打开上面的路径(如果在该路径下没找到现有文件则创建文件)
myoutfile.WriteString(outer);//开始写入上述
myoutfile.Close();
//四、删除或者重命名某个文件
CFile::Remove(strFilePathOpen);//删除该路径指定的文件
CFile::Rename(strFilePathOpen1,strFilePathOpen2);//以strFilePathOpen2文件名替换strFilePathOpen1的名字
//五、修改文件中指定的行
方法一,由于CStdioFile类中的Write函数只能“覆盖写入”,所以只有当替换行与被替换行的字符数始终相等时,才可以用这个方法!
CStdioFile file;
if (file.Open(strFilePathOpen, CFile::modeReadWrite))
{
CString str = NULL;
while (file.ReadString(str))
{
if (str.Left(4) == CString("G01A"))//定位到要编辑的行,比如此时str的内容是G01A-66B-230
{
abstr="987654321";//编辑好要写入的内容
file.Seek(-2 - str.GetLength(), CFile::current);//将位置定位移动到该行起始处,-2对应的是\n这两个字符
file.Write(abstr, strlen(abstr));//在当前位置开始写入内容,写入多少字符就覆盖掉原来文件中多少字符
break;
}
}
}
方法二,引入vector这种数据结构大大加快了读写速度,这才是科学且通用方法。
CStdioFile file;
std::vector outer;
if (file.Open(strFilePathOpen, CFile::modeReadWrite))
{
CString str = NULL;
while (file.ReadString(str))
{
if (str.Left(4) == CString("G01A"))//定位到要编辑的行,比如此时temp2的内容是G01A-66B-230
{
str = "G01"+abstr;//编辑好要写入的内容
}
outer.push_back(str+"\n");//将每一行都存进vector容器中
}
}
file.Close();
//开始写修改后的文件
CFile::Remove(strFilePathOpen);//首先删除原先的文件
CStdioFile myoutfile;//在原来的位置创建新文件重新写
myoutfile.Open(strFilePathOpen, CFile::modeReadWrite | CFile::modeCreate | CFile::modeNoTruncate);//打开上面的路径
for (int i = 0; i < outer.size(); i++)
{
myoutfile.WriteString(outer[i]);//开始写(这是逐行写入)
}
myoutfile.Close();
outer.clear();