D.S.REVIEW_ALL_2016_12_15

/* author:JiahaoZhang time: 2016_12_15_Revise method:About : 05顺序表(Sequential list)是线性表(Linear List)基于数组的存储形式! 01)Yan 02)Yin 03)Weiss — 06为链式存储方式(Linked List) 01)Yin 02)Weiss More:In ch03_Stack_Queue_heap———-heap ch04_Array\\Stribg\\GenList—————->GenList ch05_Tree———————————————>DM ch06_Set————————————————UFSet ch07_Search—————————————-BST ch08_Graph——————————————MST!prim&&kruskal ch09_Sort———————————————Shell\\Quick\\Merge / /\ Methid : C++ learning !文件和流!模板!template */ 以下转义序列。在复制到输出流时,这些序列导致它们的相关操作在有此功能的设备上显示: \\\ 反斜杠 \\a 警告 \\b 退格 \\f 换页 \\n 换行 \\r 回车 \\t 跳格 \\v 垂直跳格 \\ddd ddd 是 1、2 或 3 位八进制数字。这些转义序列作为由八进制数指定的具有数字值的字节显示。 ——-文件和流

C++ 文件和流

到目前为止,我们已经使用了 iostream 标准库,它提供了 cincout 方法分别用于从标准输入读取流和向标准输出写入流。 本教程介绍如何从文件读取流和向文件写入流。这就需要用到 C++ 中另一个标准库 fstream,它定义了三个新的数据类型:

数据类型

描述

ofstream

该数据类型表示输出文件流,用于创建文件并向文件写入信息。

ifstream

该数据类型表示输入文件流,用于从文件读取信息。

fstream

该数据类型通常表示文件流,且同时具有 ofstream 和 ifstream 两种功能,这意味着它可以创建文件,向文件写入信息,从文件读取信息。

要在 C++ 中进行文件处理,必须在 C++ 源代码文件中包含头文件

打开文件

在从文件读取信息或者向文件写入信息之前,必须先打开文件。ofstreamfstream 对象都可以用来打开文件进行写操作,如果只需要打开文件进行读操作,则使用 ifstream 对象。 下面是 open() 函数的标准语法,open() 函数是 fstream、ifstream 和 ofstream 对象的一个成员。

void open(const char *filename, ios::openmode mode);

在这里,open() 成员函数的第一参数指定要打开的文件的名称和位置,第二个参数定义文件被打开的模式。

模式标志

描述

ios::app

追加模式。所有写入都追加到文件末尾。

ios::ate

文件打开后定位到文件末尾。

ios::in

打开文件用于读取。

ios::out

打开文件用于写入。

ios::trunc

如果该文件已经存在,其内容将在打开文件之前被截断,即把文件长度设为 0。

您可以把以上两种或两种以上的模式结合使用。例如,如果您想要以写入模式打开文件,并希望截断文件,以防文件已存在,那么您可以使用下面的语法:

ofstream outfile; outfile.open(“file.dat”, ios::out | ios::trunc );

类似地,您如果想要打开一个文件用于读写,可以使用下面的语法:

fstream afile; afile.open(“file.dat”, ios::out | ios::in );

关闭文件

当 C++ 程序终止时,它会自动关闭刷新所有流,释放所有分配的内存,并关闭所有打开的文件。但程序员应该养成一个好习惯,在程序终止前关闭所有打开的文件。 下面是 close() 函数的标准语法,close() 函数是 fstream、ifstream 和 ofstream 对象的一个成员。

void close();

写入文件

在 C++ 编程中,我们使用流插入运算符( << )向文件写入信息,就像使用该运算符输出信息到屏幕上一样。唯一不同的是,在这里您使用的是 ofstreamfstream 对象,而不是 cout 对象。

读取文件

在 C++ 编程中,我们使用流提取运算符( >> )从文件读取信息,就像使用该运算符从键盘输入信息一样。唯一不同的是,在这里您使用的是 ifstreamfstream 对象,而不是 cin 对象。

读取 & 写入实例

下面的 C++ 程序以读写模式打开一个文件。在向文件 afile.dat 写入用户输入的信息之后,程序从文件读取信息,并将其输出到屏幕上:

include

include

using namespace std;
int main ()
{
char data[100];
// 以写模式打开文件 ofstream outfile; outfile.open(“afile.dat”); cout << “Writing to the file” << endl; cout << “Enter your name: “; cin.getline(data, 100);
// 向文件写入用户输入的数据 outfile << data << endl; cout << “Enter your age: “; cin >> data; cin.ignore();
// 再次向文件写入用户输入的数据 outfile << data << endl;
// 关闭打开的文件 outfile.close();
// 以读模式打开文件 ifstream infile; infile.open(“afile.dat”); cout << “Reading from the file” << endl; infile >> data;
// 在屏幕上写入数据 cout << data << endl;
// 再次从文件读取数据,并显示它 infile >> data; cout << data << endl;
// 关闭打开的文件 infile.close();
return 0;
}

当上面的代码被编译和执行时,它会产生下列输入和输出:

$./a.out
Writing to the file Enter your name: Zara
Enter your age: 9
Reading from the file Zara
9

上面的实例中使用了 cin 对象的附加函数,比如 getline()函数从外部读取一行,ignore() 函数会忽略掉之前读语句留下的多余字符。 以上可以通过,输入输出 对象流来进行(例如 time24_03作业的,通过磁盘已经重载的运算符进行 代替相应的键盘和屏幕的输入和输出!!! )

文件位置指针

istreamostream 都提供了用于重新定位文件位置指针的成员函数。这些成员函数包括关于 istream 的 seekg(”seek get”)和关于 ostream 的 seekp(”seek put”)。 seekg 和 seekp 的参数通常是一个长整型。第二个参数可以用于指定查找方向。查找方向可以是 ios::beg(默认的,从流的开头开始定位),也可以是 ios::cur(从流的当前位置开始定位),也可以是 ios::end(从流的末尾开始定位)。 文件位置指针是一个整数值,指定了从文件的起始位置到指针所在位置的字节数。下面是关于定位 “get” 文件位置指针的实例:

// 定位到 fileObject 的第 n 个字节(假设是 ios::beg) fileObject.seekg( n );
// 把文件的读指针从 fileObject 当前位置向后移 n 个字节 fileObject.seekg( n, ios::cur );
// 把文件的读指针从 fileObject 末尾往回移 n 个字节 fileObject.seekg( n, ios::end );
// 定位到 fileObject 的末尾 fileObject.seekg( 0, ios::end );

这样可以对一个文件进行输入输出的综合使用!《即所谓的随机存取!Random access》

文件出错检查

ios- ifstream ofstream 有成员函数(ios类中的,所以其子类中也会有!if的对象 也可以使用这些成员函数) fail()如果操作失败(设备上没有空间、或者要读取的文件不存在)return true;

Eg:
if( out.fail() ){
cerr<<””<<endl;
return 1;// main 函数里
}

end() 如果到文件末尾,则true

Single character I/O and detecting the end of a file(单字符的I/O和文件末尾的检测!)

in.get(c);
count = 1;
while( !in.enf() )
{
out.put(c);
in.put(c);
count++;
}
in.close();
out.close();

——-异常处理

动态断言assert
assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:
#include
void assert( int expression );

assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,
然后通过调用 abort 来终止程序运行。
[cpp] view plain copy

print?

include

include

void test(int p)
{
assert(p != NULL);
printf(“%d\\n”,
p);
}
int main(void)
{
test(NULL);
}
关闭动态断言 ,必须放在#include前面
[cpp] view plain copy
print?

define NDEBUG

——-STL

http://www.cplusplus.com/reference/vector/vector/operator%5b%5d/ http://www.runoob.com/cplusplus/cpp-stl-tutorial.html

cerr与cout的主要区分就是,cout输出的信息可以重定向,而cerr只能输出到标准输出(显示器)上。

运行结果是:
在生成的cout.txt文件中输出了”hello world—-cout”
同时在显示器上输出了”hello world—-cerr”
也就是说cout的输出可以重定向到一个文件中,而cerr必须输出在显示器上。
cout是标准输出流,与cerr的区别在于cerr不经过缓冲区,直接向显示器输出信息,而cout中的信息存放在缓冲区,缓冲区满或者遇到endl时才输出.
对于为什么有cerr和cout
比如,你的程序遇到调用栈用完了的威胁(无限,没有出口的递归)。
你说,你到什么地方借内存,存放你的错误信息?
所以有了cerr。其目的,就是在你最需要它的紧急情况下,还能得到输出功能的支持。
缓冲区的目的,就是减少刷屏的次数——比如,你的程序输出圣经中的一篇文章。不带缓冲的话,就会每写一个字母,就输出一个字母,然后刷屏。有了缓冲,你将看到若干句子“同时”就出现在了屏幕上(由内存翻新到显存,然后刷新屏幕)。

参考资料: http://baike.baidu.com/view/2254717.htm

(っ•̀ω•́)っ✎⁾⁾ 坚持技术学习、内容输出与分享,您的支持将鼓励我继续创作!(*/ω\*)
( • ̀ω•́ )✧如有疑问或需要技术讨论,请留言或发邮件到 aclearzhang@qq.com.(*・ω< ) 
  • 本文作者:: AClearZhang
  • 本文链接:: 371.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!