一、文件I/O
· 前边我们已经给大家简单绍和演示过c和C++在终端I/O处理上的异同点。
· 现在我们培着来研究文件I/O。
· 例如:fileCopy sourceFile destFile
二、重点分析
· argc与argv[]
· 在程序中main函数有两个参数﹐整型变量argc和字符指针数组argv[]。
· argc的含义是程序参数数量,包含本身。
· argv[]的每个指针指向命合行的一个字符串,所以argv[0]指向字符串"copyFile.exe" 。argv[1]指向字符串sourceFile,argv[2]指向字符串destFile。
· in和out是我们声明的两个文件指针,它们的类型都是FILE*,分别作为两个I/O流对象使用。
· if( argc != 3 )是为了确保程序参数个数的正确性。涌过fopen()函数我们以二进制的形式按可读/可写方式打开两个文件并返回两个文件指针给in和out。
· 为了确保文件成功打开,我们还对fopen()的返回值进行了检查,如果为成功打开,我们就向标准错误流stderr发送一条消息。
· getc()函数一次从输入流(stdin)读取一个字符,putc()函数把这个字符写入到输出流(stdout)。
· 当getc()遇到文件结束标志的时候,函数就返回EOF。EOF是一个宏,在stdio.h中定义,其值为一个负整数,通常是-1。
· EOF事实上有两个含义∶MSDN
· 注意细节,getc()的返回值是int类型哦,所以我们声明时应该是int ch,而不是char ch 。
三、C++的文件操作
· 为什么不先把类和对象讲清楚呢?
· 我们依旧老规矩·以实例为主,以事实说话:↓
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
ifstream in;
in.open( "test.txt" );
if( !in )
{
cerr <<"打开文件失败"<< endl ;
return 0;
}
char x;
while( in >> x );
{
cout << x;
}
cout << endl;
in.close();
return 0;
}
· 从刚刚的例题我们得到的信息是C++由于有类的封装,很多东西都变得更加“仔细”了。
· 上边的例题我们用到的是文件的读取类ifream。
· 接着我们结合例题来说说文件的写入要用到的类ofream:↓
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
ofstream out;
out.open( "test.txt" );
if(!out)
{
cerr <<"打开文件失败!"<<endl ;
return 0;
}
for( int i=0; i < 10; i++ )
{
out << i;
}
out <<endl;
out.close();
return 0;
}
· 在前边两个例子中我们出现:
ifstream in;
in.open("test.txt");
和
ofstream out;
out.open( "test.txt" );
· 它们都是用一个open 函数来完成打开文件的功能。当然,这不是唯一的方法,我们还可以这样实现。
ifstream in( "test.txt");
和
ofstream out( "test.txt" );
· 以上代码在创建一个ifstream 和ofstream类的对象时,将文件的名字传递结它们的构造函数。
· 暂时我们可以这么理解构造函数∶就是对象默认使用的函数(方法)。
· 那么这两种方法有什么区别吗?结论是没有区别。
· 事实上它还可以接受不止一个参数。
· 下边我们给出一个接受两个参数的实例:ifstream in( char* filename, int open_mode)
· 其中,filename表示文件的名称,它是一个字符串;open_mode表示打开模式,其值用来定义以怎样的方式打开文件(跟open的参数一样)。
· 下面结出几种常见的打开模式:
ios:.in -- 打开一个可读取文件
ios::out -- 打开一个可写入文件
ios::binary -- 以二进制的形式打开一个文件
ios::app -- 写入的所有数据将被追加到文件的末尾
ios:trunk -- 删除文件原来已存在的内容
iosnocreate -- 如果要打开的文件不存在,那么以此参数调用open函数将无法进行
ios::noreplece -- 如果要打开的文件已存在,试图用open 函数打开时将返回一个错误
· 下面我们给出一个关于如何使用打开模式的例子:↓
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
fstream fp("test.txt",ios::in | ios::out);
if( !fp )
{
cerr <<"打开文件失败"<<endl ;
return 0;
}
fp<<"fusheng";
static char str[10];
fp.seekg(ios::beg);
fp >> str ;
cout << str << endl ;
fp.close();
return 0;
}