使用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
如何使用
我们按照习惯使用# 或者 // 来注释,表明不需要用这一行配置,而使用空格来表明字段之间的分隔。如上有四个变量字段需要读写,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();
}
运行结果如下:
注意
1、这种模式好处是简单,但是注释是有问题的,不能将带空格的一行整个注释,
在调试时如果不需要什么开关变量,用这种方式就很方便了,解决问题,但是程序没有处理带空格的注释行,只能注释不带空格的一行,如果需要再调试时可以让带空格的一行整个注释,请修改代码
2、如何修改地更好使用
如果需要更好地开关某一行,应该使用getline函数,也是一样的方便,加上istringstream,依然可以使用这种模式去读写配置。