C++ 文件和流
iostream
标准库:它提供了 cin
和 cout
方法分别用于从标准输入读取流和向标准输出写入流。
fstream
标准库:从文件读取流和向文件写入流。定义了三个新的数据类型:
-
打开文件:
void open(const char *filename, ios::openmode mode);
在从文件读取信息或者向文件写入信息之前,必须先打开文件。ofstream
和fstream
对象都可以用来打开文件进行写操作,如果只需要打开文件进行读操作,则使用ifstream
对象。ofstream outfile; outfile.open("file.dat", ios::out | ios::trunc );
-
关闭文件:
void close();
-
写入文件:
ofstreamObj <<
-
读取文件:
ifstreamObj >>
-
文件位置指针:
seekg
和seekp
的参数通常是一个长整型,第二个参数可以用于指定查找方向。查找方向可以是ios::beg
(默认的,从流的开头开始定位),也可以是ios::cur
(从流的当前位置开始定位),也可以是ios::end
(从流的末尾开始定位)。
异常处理
-
try
、catch
关键字:捕获异常 -
throw
关键字:抛出异常#include <iostream> using namespace std; double division(int a, int b) { if( b == 0 ) { throw "Division by zero condition!"; // 抛出异常 } return (a/b); } int main () { int x = 50; int y = 0; double z = 0; try { z = division(x, y); cout << z << endl; }catch (const char* msg) { // 捕获异常 cerr << msg << endl; } return 0; }
-
std::exception
类:定义新的异常
动态内存
- 栈:在函数内部声明的所有变量都将占用栈内存。
- 堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存。
您无法提前预知需要多少内存来存储某个定义变量中的特定信息,所需内存的大小需要在运行时才能确定。
-
new
运算符:为给定类型的变量在运行时分配堆内的内存,返回所分配的空间地址。 -
delete
运算符:删除之前由new
运算符分配的内存。int *p = new int[10]; //分配10个int型的内存空间 delete[] p;
int *p = new int; //分配1个int型的内存空间 delete p; //释放内存
new 也是在堆区分配内存,必须手动释放,否则只能等到程序运行结束由操作系统回收。为了避免内存泄露,通常 new 和 delete、new[] 和 delete[] 操作符应该成对出现。
内存泄漏:程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
malloc() 函数在 C 语言中就出现了,在 C++ 中仍然存在,但建议尽量不要使用 malloc() 函数。new 与 malloc() 函数相比,其主要的优点是,new 不只是分配了内存,它还创建了对象。
命名空间
命名空间:作为附加信息来区分不同库中相同名称的函数、类、变量等。使用了命名空间即定义了上下文。本质上,命名空间就是定义了一个范围。
namespace
定义命名空间:namespace namespace_name { // 代码声明}
,命名空间可以嵌套。- 调用命名空间成员:
name::code; // code 可以是变量或函数
using namespace
指令:using namespace namespace_name;
using 指令也可以用来指定命名空间中的特定项目,如using std::cout;
。
模板
模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。
模板是创建泛型类或函数的蓝图或公式,可以使用模板来定义函数和类。
- 函数模板:
template <typename type> ret-type func-name(parameter list) { // 函数的主体 }
template <typename T>
inline T const& Max (T const& a, T const& b)
{
return a < b ? b:a;
}
- 类模板:
template <class type> class class-name { . . . }
预处理
-
#define
预处理:#define macro-name replacement-text
创建符号常量,称为宏。当这一行代码出现在一个文件中时,在该文件中后续出现的所有宏都将会在程序编译之前被替换为 replacement-text。 -
参数宏:
#define MIN(a,b) (a<b ? a : b)
-
条件编译:
#ifdef NULL #define NULL 0 #endif
-
##
和#
运算符:#
运算符会把 replacement-text 令牌转换为用引号引起来的字符串。##
运算符用于连接两个令牌。
信号处理
void (*signal (int sig, void (*func)(int)))(int);
:捕获突发事件,调用格式signal(registered signal, signal handler)
int raise (signal sig);
:生成信号,sig
是要发送的信号的编号,这些信号包括:SIGINT、SIGABRT、SIGFPE、SIGILL、SIGSEGV、SIGTERM、SIGHUP
。int main () { int i = 0; // 注册信号 SIGINT 和信号处理程序 signal(SIGINT, signalHandler); while(++i){ cout << "Going to sleep...." << endl; if( i == 3 ){ raise( SIGINT); } sleep(1); } return 0; }