当前位置:首页> 正文

C++11新特性(20)-用string对象处理文件名-文件名长度

C++11新特性(20)-用string对象处理文件名

C风格字符串

从C语言开始,就已经实现了对字符串的支持。为了处理C风格字符串,C语言标准库提供了一组函数,它们被定义在cstring.h头文件中:

strlen(p) 计算字符串长度

strcmp(p1, p2) 字符串比较

strcat(p1, p2) 字符串连接

strcpy(p1, p2) 字符串比较

从功能上来讲,C风格字符串完全可以满足开发的需求。但是严格地讲,C风格字符串并不是一种数据类型,而是以\n结尾的字符数组,所以会带来一些不便甚至危险:

1.保存字符串的内存空间需要程序员管理,容易出错。

2.几乎所有的处理都需要理解并正确运用\0结尾这件事。

如果你是一个老手,字符串处理可能是你的技能之一,但是如果你是一个新手,可能遇到的都是坑。

C++中的字符串

为了解决上面的问题,C++标准库提供了string类。使用string类,程序员首先(大部分场合)可以不必考虑字符串的内存分配问题,再就是可以使用更加直观地方式来操作字符串,例如:

使用=运算符实现字符串拷贝

使用+或+=运算符实现字符串连接

使用[]从字符串取得指定的字符

使用比较运算符进行字符串比较

当然string类的功能远不止这些,具体可以参考下面的链接.

http://www.cplusplus.com/reference/string/string/

C++标准库中的文件名

回到今天的主题,C++标准库中,定义了3个类来支持文件读写:

ifstream:支持从文件读取数据

ofstream:支持向文件写入数据

fstream:支持读写数据。

不知为什么,C++一方面提倡避免使用C风格字符串,一方面在自己的标准库中表达文件名时继续使用C风格字符串而不是string类。例如ifstream::open方法:

void open(const char* filename,
ios_base::openmode mode = ios_base::in);

这种情况在C++11时发生了改变,除了支持上述方式之外,同时也可以使用下面的方法:

void open (const string& filename, 
ios_base::openmode mode = ios_base::in);

打开文件方法中文件名参数增加了对string类的支持。虽然这里只是举了ifstream::open的例子,这种变化也同样适用于其他几个文件操作类。

作者观点

老罗说,坚果手机是给锤粉做的。

我想,C++11的新功能中有好大一部分是为C++中程序员中的强迫症做的。

觉得本文有帮助?请分享给更多人。

关注【面向对象思考】,轻松学习每一天!

展开全文阅读

相关内容