c++中txt文件的读取以及在MFC中读取txt坐标数据并完成图形绘制

主要介绍如何读取txt文件中的坐标数据,并在MFC窗口中绘制出来,工程创建方法和绘图方法与上一篇博文基本一致,这里就不再详赘述,可参考上一篇博文vs2010、MFC窗口中绘制点、线、面

C++中读取文件的方法有两种,一种是来自于C语言的“文件指针”方法,另一种是C++中的“文件流”思想。

1、文件指针

FILE * fopen(const char * path,const char * mode);

-- path: 文件路径,如:"F:\test.txt"

-- mode: 文件打开方式,例如:

"r" 以只读方式打开文件,该文件必须存在。

"w" 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。

"w+" 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存

"a" 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)

"a+" 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。(原来的EOF符不保留)

"wb" 只写打开或新建一个二进制文件,只允许写数据。

"wb+" 读写打开或建立一个二进制文件,允许读和写。

"ab" 追加打开一个二进制文件,并在文件末尾写数据。

"ab+"读写打开一个二进制文件,允许读,或在文件末追加数据。  

 

    --返回值: 文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno中。  

示例1:利用文件指针读取txt文件内容

#include <stdio.h>   
#include <stdlib.h>  
int main()
{
   int i = 0;
	float f = 0;
	char str[100] = "";

	FILE* fp = fopen("E:\\test2\\test1.txt", "r");
	if (fp != NULL) {
      
      //根据字符类型读取txt文件中的数据
      fscanf(fp, "%d%f%s", &i, &f, str);
      
      //数据读完之后一定要关闭文件指针
      fclose(fp);
    }
	//将读出的内容显示
	printf(" i = %d\n f = %.2f\n str = %s\n", i, f, str);
}

2、利用文件流读取txt文件中的数据

此方法所涉及到的头文件:#include <fstream>

文件读写的步骤:

1、包含的头文件:#include <fstream>

2、创建流

3、打开文件(文件和流关联)

4、读写 (写操作:<<,put( ), write( ) 读操作: >> , get( ),getline( ), read( )),今天只介绍 “ >> ” 读文件方法

5、关闭文件:把缓冲区数据完整地写入文件, 添加文件结束标志,切断流对象和外部文件的连接 (一定要关闭文件)

#include <fstream>  
#include <iostream>  
using namespace std;  
void main()  
{  
	int datalen=0;

    double num[100];

    //打开文件流
    ifstream file("E:\\面向对象课程实习\\面向对象实习课资料\\test2\\test2.txt");
    
    //判断文件指针是否为空
    while( ! file.eof() )

    //若不为空,则循环读取存入数组,这里的读取以空格、Tab、回车结束,以单词为单位
    file>>num[datalen++];

    //输出数组元素
    for(int i=0;i<datalen;i++)
    {
        cout<<num[i]<<" ";
    }
	cout<<"\n";

    //关闭文件流
    file.close();
   
}  

3、在MFC中读取txt文件中的坐标,并在窗口中绘制图形

MFC工程创建部分这里不再赘述,请参考上一篇博文。

3.1、利用文件指针读取txt文件,并画点

(1)首先建立好MFC界面,添加【画图】菜单,在【画图】菜单下添加【画点】、【画线】、【画面】三个子菜单。

(2)添加【画点】菜单的事件处理程序

void CMFC_2View::OnDrawPoint()
{
	// TODO: 在此添加命令处理程序代码
	//定义一个文件指针
	FILE *fp;
	//初始化文件指针,r表示只读
	fp = fopen("E:/point.txt", "r");

	//定义变量X,Y存储点的坐标值
	int x;
	int y;

	//构造一个DC,传入当前对象.表示在当前对象使用.
	CClientDC dc(this);
	//画笔
	CPen pen(PS_SOLID, 3, RGB(25,25,25));
	dc.SelectObject(&pen);
	//画刷
	CBrush *pBrush = new CBrush(RGB(25,25,25));
	dc.SelectObject(pBrush);
	//判断文件指针是否为空
	while (!feof(fp)){
		//若不为空,则往后读取两位整数类型,存储到X,Y中,读取的同时,文件指针也会向后移
		fscanf(fp, "%d%d", &x, &y);
		//以(X,Y)为圆心,5为半径绘制圆点
		dc.Ellipse(x-5,y-5,x+5,y+5);

	}
	//关闭文件,这一步很重要,C++编程中,所有打开的文件,最后一定要关闭
	fclose(fp);

}

(3)在point.txt文件中5个点坐标

(4)运行结果如下:

3.2 利用文件流读取txt文件,并完成画线和画面

首先需要在前面添加

#include <fstream>  
#include <iostream>

using namespace std;

(1)给【画线】菜单添加事件处理程序

void CMFC_2View::OnDrawLine()
{
	// TODO: 在此添加命令处理程序代码
	//定义一个点数组
	CPoint points[100];
	//定义一个变量来存储点的个数
	int i=0;
	//定义一个文件流对象
	ifstream file;
	//初始化这个文件六对象
	file.open("e://line.txt");

	//判断文件流指针是否为空
	while (!file.eof())
	{
		//若不为空循环读取点坐标数据
		 file >> points[i].x;
		 file >> points[i].y;
		 i++;
	}
	//关闭文件流(这一步很重要)
	file.close();
	//构造一个DC,传入当前对象.表示在当前对象使用.
	CClientDC dc(this);
	//创建一个画笔.(线的类型, 宽度, 颜色);
	CPen pen(PS_SOLID, 1, RGB(255, 0, 255));
	//把画笔选到设置描述表当中.覆盖默认画笔.
	dc.SelectObject(&pen);
	//polyline方法的两个参数分别为构成线的点集,以及点的个数
	dc.Polyline(points,i);

}

 

(2)新建一个line.txt文件,写入几个点坐标文件

(3)显示结果

(4)给【画面】菜单添加事件处理程序

画线和画面的文件读取方法是一样,只是最后调用的函数不同。

void CMFC_2View::OnDrawPolygon()
{
	// TODO: 在此添加命令处理程序代码
	//定义一个点数组
	CPoint points[100];
	//定义一个变量来存储点的个数
	int i=0;
	//定义一个文件流对象
	ifstream file;
	//初始化这个文件六对象
	file.open("e://polygon.txt");

	//判断文件流指针是否为空
	while (!file.eof())
	{
		//若不为空循环读取点坐标数据
		file >> points[i].x;
		file >> points[i].y;
		i++;
	}
	//关闭文件流(这一步很重要)
	file.close();
	//构造一个DC,传入当前对象.表示在当前对象使用.
	CClientDC dc(this);
	//创建一个画笔.(线的类型, 宽度, 颜色);
	CPen pen(PS_SOLID, 1, RGB(255, 0, 255));
	//把画笔选到设置描述表当中.覆盖默认画笔.
	dc.SelectObject(&pen);
	//polygon方法的两个参数分别为构成线的点集,以及点的个数
	dc.Polygon(points,i);
}

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页