c++那些事儿7 0 I O流,文件操作

344 阅读6分钟

###知识点综述:


``` C++ I/O: 在iostream头文件中定义 istream //通用输入流和其它输入流基类。 ostream //通用输出流和其它流基类。 iostream //通用输入输出流和其它输入输出流基类。 在fstream头文件中定义 ofstream //文件写操作 内存写入存储设备 ifstream //文件读操作,存储设备读区到内存中 fstream //读写操作,对打开的文件可进行读写操作 在strstream头文件中定义 istrstream //输入字符串流 ostrstream //输出字符串流 strstream //输入输出字符串流 cin,cout: cin,是istream的派生类的对象,是标准输入流。 cout,是ostream的派生类的对象,是标准输出流。

操作步骤: (1)建立文件流对象; (2)打开或建立文件; (3)进行读写操作; (4)关闭文件; 格式控制输出: dec 10进制输出, hex 16进制输出 oct 8进制输出. setfill(c)设置填充字符c , setprecision(n)设置实数的精度的n位。 setw(n)设置字段宽度n setiosflags(ios::fixed)设置浮点数以固定的小数位显示 setiosflags(ios::left)输出数据左对齐, setiosflags(ios::right)输出数据右对齐 ios类中: void open(const char* filename,ios_base::openmode mode); mode打开文件的方式  ios::binary: 以二进制方式打开文件,缺省的方式是文本方式 ios::in: 文件以输入方式打开(文件数据输入到内存)(ifstream对象默认方式就是这个) ios::out: 文件以输出方式打开(内存数据输出到文件)(ofstream对象默认的打开方式

常识: 文本文件和二进制文件 文本文件:由字符序列组成,以字符(character) 为存取最小信息单位,也称“ASCII码文件”。 二进制文件:由二进制数组成。

相关的函数: void open( const char *filename );
//函数open()用于文件流。它打开filename 并将其与当前的流相关联。 void close(); //函数关闭相关的文件流。
ostream &flush();
//flush()函数可以引起当把前流的缓冲区写出到附属设备中去。 int get();
//读入一个字符并返回它的值,重载函数特别多。 ostream &put( char ch );
//函数put()用于输出流,并把字符ch写入流中。 istream &get( char &ch );
//读入一个字符并把它存储在ch, istream &getline( char *buffer, streamsize num );
//getline()函数用于输入流,读取字符到buffer中, istream &read( char *buffer, streamsize num ); //函数read()用于输入流,在将字符放入buffer 之前从流中读取num 个字节。 如果碰到EOF, read()中止ostream &write( const char *buffer, streamsize num );

    //write()函数用于输出流,从buffer中写num个字节到当前输出流中。
<hr>
**看一张I/O相关类的图**
![c++流的关系图.jpg](http://upload-images.jianshu.io/upload_images/4976516-461029cdcafa6bc6.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
<hr>
**常见对象的解释**

![c++ I-O.PNG](http://upload-images.jianshu.io/upload_images/4976516-eee82c7d4a193afa.PNG?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
<hr>
###看代码

#include #include #include #include void display(); void writeFile(); void readFile(); void readBinaryFile(); void copyFile(); using namespace std; int main() { display(); //格式控制符的运用。 writeFile(); readFile(); readBinaryFile(); copyFile(); system("pause"); return 0; }

void display() { int a = 123; float b = 1.2345f; double c = 1.23456; string d = "dflx";

cout << "dec:" << dec << a << endl;
cout << "hex:" << hex << a << endl;
cout << "oct:" << oct << a << endl;
cout << setw(5) << d << endl;
cout << setfill('*') << setw(5) << d << endl;
cout << setw(5) << setiosflags(ios::right) << a << endl;
cout << setw(5) << setiosflags(ios::left) << a << endl;
cout << setiosflags(ios::scientific) << setprecision(8);
cout << "c=" << c << endl;
cout << "c=" << setprecision(5) << c << endl;
cout << "------------------"<<endl;
cout.put('a') << endl;
putchar('b');
cout << endl;
cout << "enter a sentence:";
int ch;
while ((ch = cin.get()) != '#')
	cout.put(ch);
cout <<endl<< "--------------------格式控制结束------------------------" << endl;

}

//文本方式写 void writeFile() {

/*
  ofstream outfile; 建立ifstream对象
  outfile.open("D:\\workspace_java\\File\\g.txt");  将对象与文件关联
  等价面的。
*/
cout << "-----------写文本文件------------" << endl;
ofstream outfile("D:\\workspace_java\\File\\g.txt", ios::out);
if (!outfile) {
	cerr << "open error" << endl;
	exit(1);
   }
string  str= "hello c plus plus \n";
outfile << str;  //使用该对象将数据输出到文件
outfile.close();

} //文本方式读 void readFile() { cout << "-----------读文本文件------------" << endl; ifstream ifs; ifs.open("D:\workspace_java\File\g.txt"); char str[255]; //定义一个字符数组 //ifs >> str; //将文件中的数据读到str中。但是c++插入操作符遇到空字符变停止输出。 ifs.getline(str,255); cout << str << endl; cout << "------------------" << endl; /如果我们想要在命令行中写一段话,而且这段换中包含了空格和回车, 那么我们就应该利用上面getline()函数的第三个参数,/ ifstream file("D:\workspace_java\File\a.txt"); if (!file) { cerr << "文件打开失败" << endl; } char str1[1024]; file.getline(str1, 255, 0); cout << str1 << endl;

}

/* 对于二进制文件的读写,我们必须强调的一点就是打开文件属性必须添加:ios::binary, 其实就是告诉系统,我要按照二进制格式进行读写文件了。 */ //二进制文件读 void readBinaryFile() { cout << "-----------读二进制文件------------" << endl; ifstream file; file.open("D:\workspace_java\File\g.txt",::ios::binary); if (!file) { cerr << "文件打开失败" << endl; } char str[1024] = { 0 }; file.read(str, sizeof(char) * 1024); cout << str << endl; file.close();

} /* 记住,write有两个参数,第一个为字符数组参数,第二个需要输入到文件的数据的 大小 举列子: ofstream fout("text.bat", ios::binary);关联时候。 string str = "Hello word"; fout.write(str.c_str(),sizeof(char)*(str.size())); */

//文件复制 void copyFile() { ifstream copy_file("D:\workspace_java\File\春雨.txt"); ofstream new_file("D:\workspace_java\File\我的春雨.txt"); if (!copy_file || !copy_file) { cerr << "文件打开失败" << endl; return; }

while (!copy_file.eof()) {
	char buf[1024];
	copy_file.read(buf, sizeof(char) * 1024);
	new_file.write(buf, sizeof(char) * 1024);
}
cout << "文件复制成功" << endl;

}

<hr>
**结果如下**


![结果.PNG](http://upload-images.jianshu.io/upload_images/4976516-3dc4f5ffb812d4eb.PNG?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
<hr>
##重要知识点总结:

总结 几个重要的东西: 文件操作的流程 (1)建立文件流对象; ofstream //文件写操作 内存写入存储设备
ifstream //文件读操作,存储设备读区到内存中
(2)打开或建立文件; void open(const char* filename,ios_base::openmode mode); mode打开文件的方式: ios::binary: 以二进制方式打开文件,缺省的方式是文本 ios::in:    文件以输入方式打开(文件数据输入到内存)(ifstream对象默认方式就是这个) ios::out:   文件以输出方式打开(内存数据输出到文件)(ofstream对象默认的打开方式 (3)进行读写操作; istream &getline( char *buffer, streamsize num ); istream &read( char *buffer, streamsize num ); //函数read()用于输入流,在将字符放入buffer 之前从流中读取num 个字节。 如果碰到EOF,read()中止 ostream &write( const char *buffer, streamsize num ); //write()函数用于输出流,从buffer中写num个字节到当前输出流中。 (4)关闭文件; close();

文件复制中: bool eof(); //如果到达相关联的输入文件的末尾,eof()函数返回true,否则返回false。

<hr>
>c++ 的 I/O不会比java差,只是各自实现的方式不一样。

<hr>