c++中文件的读处理多种方案解析

1. 读文件准备工作

1.前提,首先读文件需要引入头文件ifsteam或者ofstream。
2.直接创建类对象  如:ifstream ifs;
3.需要提前创建数组或者是字符串变量来存储,ifs对象所读取的文本内容

接着有三种方法来读取文件内容。

  1. getline(ifs,string ) 有一个全局函数getline,不依赖于类对象的前提,使用时只需要将输入流ifs作为函数参数传入getline中,并且将读取的数据存入事先创建好的数组字符串变量string中。
  2. ifs<<buf;当创建ifstream对象后,可以像操作cin一样操作这个对象,也就是可以把ifstream的对象当做cin一样进行输入
  3. ifs.getline(char *buf,sizeof(buf)) ifstream的类对象ifs中含有成员函数getline函数,可以将TXT文件中的内容一行一行的读取,每次读取之后将内容存入buf中。

2. 读取文件的3种方法举例说明

1.getline()全局函数

  1. 对于全局函数getline的用法,由于该函数默认是一行一行的读取,所以需要while循环来读取txt文本的所以内容,当遇到‘\n’,标志读取该行结束。
    当读取不到任何字符的时候就返回false,可用于判断文件是否结束

eg1:


  		fstream in;
	 	in.open("ELIST_te_sphe.txt", ios::in);//LISTE   ELIST_test1.txt   ELIST_test_sphere.txt        DLIST_tes_sphe
	string str;
	while(getline(in,str))
	{
		cout << str<<endl;
	}

在这里插入图片描述
(结果显示)在这里插入图片描述

2. 流输入方式ifs<<buf存取

  1. 对于ifs<<buf流输入方式存取,其原则是当碰见空格之后,就结束当前读取,所以想要读取完文本内容,就必须借助while,当没有字符读入时结束文本读取。
    eg2:
    在这里插入图片描述
    //代码引入
    fstream in;
	char buf[1024];
	in.open("ELIST_te_sphe.txt", ios::in);
	while (in >> buf)
	{
		cout << buf << endl;
	}

(结果显示)

在这里插入图片描述
【拓展】该读取方法将以空格作为结束读取标志,若是要读取指定区域的文本内容就需要添加代码操作,进行存取。(注:引入如下代码实现对红色区域存取)
在这里插入图片描述

  	while (in >> buf)
	{
		//cout << buf << endl;
		if ('0' <= buf[0] && buf[0] <= '9')
		{
			bianhao[i]=atoi(buf);
			//cout << atoi(buf) <<"  "<< typeid(atoi(buf)).name() << endl;
			//cout << bianhao[i] << "  "<<i<< endl;
			i++;
		}
	}
	for (int j = 0; j < i; j++)
	{
		if (!(j % 26 <= 5 && j % 26 >= 0))
		{
			temp[flag] = bianhao[j];
			cout << temp[flag] << " ";
			flag++;
			if (j % 26 == 25)
			{
				cout << endl;
			}
		}
	}
	in.close();

(结果显示)在这里插入图片描述

3.ifs.getline(char *buf,sizeof(buf))

  1. 对于ifs.getline读取方法,和getline全局函数类似。也是按行读取,并且当遇到‘\n’之后,结束当前行读取。直到没有数据读取就结束当前文本读取。(注:读取的时候也会将空格读入数组,在提取数据的时候,就需要指定关键信息存取)
    eg3:
    在这里插入图片描述
	fstream in;
	string v, x, y, z;
	int i = 0, flag = 0;
	MatrixXd temp_zuobiao(1, 4);
	MatrixXd node_zuobiao(0, 4);
	in.open("NLIST_test_sphe.txt", ios::in);//LISTE   ELIST_test1.txt   ELIST_test_sphere.txt
	while(in.getline(buf, sizeof(buf)))
	{
	stringstream word(buf);//采用字符流格式将读取的str进行空格分隔,并放入str word中
		//word >> zuobiao[flags].bianhao;
		word >> v;
		if (v <= "9"&& v >= "0")
		{
			word >> x;
			word >> y;
			word >> z;
			
			temp_zuobiao(0, 0) = atof(v.c_str());
			temp_zuobiao(0, 1) = atof(x.c_str());
			temp_zuobiao(0, 2) = atof(y.c_str());
			temp_zuobiao(0, 3) = atof(z.c_str());
			node_zuobiao = append(node_zuobiao, temp_zuobiao);
			//cout << zuobiao[flags].bianhao << " " << zuobiao[flags].U << " " <<
				//zuobiao[flags].real << " " << zuobiao[flags].imge << " " << endl;
			//flags++;
		}			
	}
	cout << "—节点坐标—" << endl << node_zuobiao << endl;

(结果显示)

在这里插入图片描述

总之

3种读取方法都只是将内容全部读出来,然后存入数组之中,如果需要对文本的指定区域进行读取就需要,写一系列操作,来实现。
本文给了几种思路可供参考,如果有更好的方法,也请多多指教。
最后如果读者觉得本文有用,还请点个赞哟!

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值