c++*读写配置ifstream(一)

使用ifstream读写配置

ifstream标准c++的读写是非常方便的,效率也很不错,但是有几点需要注意的地方。

如下的配置文件 in.txt
#418511899@qq.com-author:钱波-qianbo-2021-02-28
##field id(int):address(varchar):width(int):height(int)
1 rtsp://127.0.0.1/l.264 1280 720
//camera1
2 rtsp://127.0.0.1/l.264 1280 720
45 rtsp://127.0.0.1/l.264 640 360

c++*读写配置ifstream(一)

如何使用

我们按照习惯使用# 或者 // 来注释,表明不需要用这一行配置,而使用空格来表明字段之间的分隔。如上有四个变量字段需要读写,1 id 2 地址 3 宽度 4 高度,而标准c++是可以使用>>来直接将文件等内容直接移入变量的。

//首先打开文件
std::ifstream infile("in.txt", std::ios::in); //以文本模式打开in.txt备读
if (!infile) { //打开失败
	std::cout << "error opening source file." << std::endl;
	return -1;
}
//直接使用移入变量的方法
int id;
string  address
int width,height;
infile >>id>> address>>width>>height;

这样是可以的,非常方便,可以直接移入整形变量,或者float,double,唯一值得注意的地方是>>操作符,到文件结尾的时候需要多读一次看是否文件结束,稍有不慎程序员以为多读了一次,自己的变量怎么多读了一行,所以要使用移位符号后,立刻判断是否到了文件结尾。判断是否是注释函数:

static bool ifnote(const std::string & tmp)
{
	if (tmp.empty())
		return false;
	int l = (int)tmp.length();
	char a = tmp[0];
	char b;
	if (l >= 2)
		b = tmp[1];
	if (l == 1)
		return a == '#';
	if (l >= 2)
		return a == '#' || (a == '/'&& b == '/');
	return false;
}

以下为调用方法,main主函数

int main()
{
	ifstream infile("in.txt", std::ios::in);
	string s;
	string address, width, height;
	int i = 0;
	while (infile.good())
	{
		s.clear();
		infile >> s;
		if (infile.eof()) //注意这一行一定要有,否则下面会多执行一次
			break;

		if (s.empty())
			continue;
		if (!ifnote(s))
		{
			infile >> address >> width >> height;
			cout << s << " " << address << " " << width << " " << height << endl;
		}
		else
		{
			/*if (s[0] == '#')
			{
				std::string de = ":";
				std::map<string, string> ret;
				split_field(s, de, ret);
			}*/

		}
	}
	cout << "over" << endl;
	infile.close();
}

运行结果如下:
c++*读写配置ifstream(一)

注意

1、这种模式好处是简单,但是注释是有问题的,不能将带空格的一行整个注释

在调试时如果不需要什么开关变量,用这种方式就很方便了,解决问题,但是程序没有处理带空格的注释行,只能注释不带空格的一行,如果需要再调试时可以让带空格的一行整个注释,请修改代码

2、如何修改地更好使用

如果需要更好地开关某一行,应该使用getline函数,也是一样的方便,加上istringstream,依然可以使用这种模式去读写配置。

上一篇:小程序if else 判断显示隐藏


下一篇:c++中ifstream及ofstream超详细说明