MFC打开txt文件并读取二维不等列数组

一、打开txt文件并读取

1.创建基于对话框的MFC项目,选择基于对话框类型
2.在资源视图的Dlg中删除原有控件。添加一个按钮和两个编辑框。
3.void CReadTextFileDlg::OnBnClickedButton1()
{
CFileDialog fDlg(TRUE, _TEXT("txt"), NULL, 4|2,
_TEXT("文本文件(*.txt,*.ini,*.log)|*.txt;*.ini;*.log|全部文件(*.*)|*.*||"));
// 调用 DoModal() 方法来打开对话框
if (fDlg.DoModal() == IDOK)
{
// 设置编辑框1的内容为选择文件的路径
// GetPathName() --> 返回选定文件的完整路径
SetDlgItemText(IDC_EDIT1,fDlg.GetPathName());
//将文件路径写入编辑框
CFile fFile(fDlg.GetPathName(),CFile::modeRead);
//打开文件路径下的文件,并采用只读模式
// 因为在Windows下常用的文本保存编码为ANSI
// 而本工程在当初选择的时候选择了Unicode环境
// 所以需要使用CStringA类型的变量。
CStringA strFile ;
// 读取打开文件内容
// 第一个参数:读取内容的缓冲区域
// 第二个参数:读取内容的长度 fFile.Read(strFile.GetBufferSetLength(fFile.GetLength()),fFile.GetLength());
// 关闭文件句柄
fFile.Close();
// 释放缓冲区域
strFile.ReleaseBuffer();
// 因环境为Unicdoe的原因,CStringA不可以直接显示到界面控件上
// 所以使用CString转换为Unicdoe字符
SetDlgItemText(IDC_EDIT2,CString(strFile));
}
}

二、读取txt二维不等列数组

2.1基于第一部分的准备工作
2.1.1 在上述工程中加入以下变量:
char * cwd,用于获得文件路径

添加以下函数方法:
bool getTxtData(float** b, const int maxrow, const int maxcol, char* cwd)
const int getMaxRow(char* cwd)

2.1.2
在cpp中加入头文件

#include 
#include 
#include 
#include 
#include 

并在程序开头加入以下声明

bool getTxtData(float** b, const int maxrow, const int maxcol, char* cwd);
int const  getMaxRow(char* cwd);
using namespace std;

2.1.3
在void C打开文件Dlg::OnBnClickedButton1()中的if (fDlg.DoModal() == IDOK) 中的最后加入以下行数
因为GetPathName返回值类型是CString,所以要转为char型才可以使用。

        int len = WideCharToMultiByte(CP_ACP, 0, fDlg.GetPathName(), -1, NULL, 0, NULL, NULL);// Unicode编码模式 CString-->char *
        cwd = new char[len + 1];
        WideCharToMultiByte(CP_ACP, 0, fDlg.GetPathName(), -1, cwd, len, NULL, NULL);

2.2 在各个函数中添加以下对应代码

2.2.1
//此函数返回值为number,为txt文件中的总行数

const int getMaxRow(char* cwd) 
{  
    ifstream txtFile(cwd);//从当前文件地址中输入文件流到txrFile中
    if (!txtFile.is_open())//用来检查文件是否被打开:is_open方法。成功打开,其值为1
    {
        cout << "Error opening file"; exit(1);//退出该函数
    }
    string buffer; //访问字符操作string可以按数组方式,以下标来访问。还可以用at()函数访问指定的字符
    int number = 0;
    while (!txtFile.eof())//eof函数 ,它是ifstream 从类 ios 中继承过来的,当到达文件末尾时返回true 。(end of file)
    {
        getline(txtFile, buffer);//这里的getline通过和eof一起作用,作为一个最大行数的终止条件。即读到最后一行时,循坏结束。
        //(getline是从txtFile里面得到一行字符并输入到buffer中)
        number++;
    }
    return number;//若txt文档中最后一行为空行,则返回值为当前读取到的行数减一

}

2.2.2
//读取文本中的二维数组到程序的二维数组中并以数值形式保存

bool getTxtData(float** b, const int maxrow, const int maxcol, char* cwd){ //读取文本中的二维数组
    ifstream txtFile(cwd);//
//以输入方式打开文件,格式为ifstream file("地址")。这里实际上定义了对象txtFile
    if (!txtFile)return false;
    string buffer;      
//访问字符操作string可以按数组方式,以下标来访问。还可以用at()函数访问指定的字符
    for (int i = 0; i//结合for将txtFile中的每一行读入到buffer中
        istringstream is(buffer);//从对象buffer中读取字符到对象is中
        for (int j = 0; jis >> b[i][j]; //将is中的数值逐个赋予到b的元素中。
                      //对象可以绑定一行字符串,然后以空格为分隔符把该行分隔开来。
                        //每赋值一次,焦点跳到下一个分隔符的后面。
        }
    }

    return true;
}

2.2.3 在需要应用到该二维数组的程序函数中的开头部分加入以下函数

    const int maxrow = getMaxRow(cwd);//实现对矩阵的各行取最大值,对角线取最大值,并用函数返回指针值
    const int maxcol = 6;   //定义文件中最大列数
//动态数组除了可以用到时才创建,还可以用变量来动态定义元素的个数,如下面的maxrow、maxcol
    float** b = new float*[maxrow];    //对于生成二维及更高维的数组,应使用多维指针。
    //以二维指针为例
    //int **p=new int* [row]; //row是二维数组的行,*p是指向一个指针数组[row]的指针
    //for(int i=0; i
    //p[i]=new int [col]; //col是二维数组的列,p是指向一个int数组[col]的指针
    for (int i = 0; inew float[maxcol];
    }
    for (int i = 0; i < maxrow; i++){     //这个for语句是用new申请完数组加的一段初始化,若无,则无数据的数组元素位会显示乱码
        for (int j = 0; j < maxcol; j++)
            b[i][j] = 0;
    }

    if (getTxtData(b, maxrow, maxcol, cwd)){//getTxtData函数赋值给b了,b是float**型的是float*的指针,传指针就可以直接在内存上读写
//这个If语句中的内容可以不写,这里写是为了在Win32的控制台中显示,以证明成功读取。
        /*for (int i = 0; i  //这里先将其注释掉
    }

接着就可以使用装载着txt文件中二位数据的b数组了。(若没有第一部分提供cwd,可手动定义文件路径)

你可能感兴趣的:(mfc,C++,txt读取,二维数组)