本文转载自:VC驿站
https://www.cctry.com/thread-290075-1-1.html
1、简介:
上节课给大家介绍了各种类型的文件流对象,对文件进行了打开与关闭的操作。那么打开与关闭不是目的,打开文件之后重要的是为了要进行文件的读写操作,不然打开、关闭文件干嘛?对不对?在C++文件流操作中,可以使用多种方法对文件进行读写操作,例如:<<、>>、put、get、getline、read、write 都是可以的。接下来就分别给大家讲解下每个函数怎么用!
2、文件的写操作:
写操作对应的有:<<、put、write 等,我们来看下他们分别都能实现什么样的写文件功能!
①、写文本类型/ASCII码类型的可见字符串:<<、put
示例代码如下:
#include <fstream>
using namespace std;
int main(int argc, char* argv[])
{
short var = 20000;
ofstream fs;
fs.open("d:\\123.txt");
if (!fs) return 0;
fs << var << endl;
fs << "真的是你吗?" << endl;
fs.put('Y');
fs.close();
return 0;
}
大家看到了吧,这就是写文本文件的方式,其中 << 支持的类型比较多,put 只能写单个字符到文件,还是有一定局限性的,所以 put 平时用的比较少。
<< 支持的类型详见:http://www.cplusplus.com/referen ... eam/operator%3C%3C/
②、二进制类型写文件:write
并不一定所有的文件都是文本文件,也并不是所有的功能都要求用文本文件来实现。例如:图片文件就是二进制文件,我们用记事本打开之后发现里面是乱码,根本不是我们用眼睛能看懂的文本文件,所以类似这样的文件就不能用 << 或者 put 来写入了。那么用什么呢?可以用接下来要给大家讲解的 write 函数,他支持文本类型和二进制类型。你只要告诉他内存的地址,以及从这个地址开始要写多少字节的数据到文件就可以了,例如:
#include <fstream>
using namespace std;
int main(int argc, char* argv[])
{
short var = 20000;
ofstream fs;
fs.open("d:\\123.txt");
if (!fs) return 0;
fs.write((char*)&var, sizeof(var));
fs.close();
return 0;
}
这里面大家可以看到 write 的第一个参数是 char* 类型的,但是不要误以为 write 只能写字符串类型的数据,完全错误!char * 不一定是字符串,里面放的东西可能是字符串,也可能是二进制数据。其实对于 write 来说第一个参数如果写成 void* 可能大家能更好理解一些。也就是一个地址而已,具体这个地址里面的内容是什么,write 不关心。第二个参数就是要一个长度,要从多长的一块内存数据写到文件中。大家明白了吗?
3、文件的读操作:
①、读文本类型/ASCII码类型的文件:>>、get、getline
#include <fstream>
using namespace std;
int main(int argc, char* argv[])
{
short var = 20000;
ofstream fs_out;
fs_out.open("d:\\123.txt");
if (!fs_out) return 0;
fs_out << var << endl;
fs_out.close();
var = 3000;
ifstream fs_in;
fs_in.open("d:\\123.txt");
if (!fs_in) return 0;
fs_in >> var;
char ch = fs_in.get();
fs_in.close();
return 0;
}
>>支持的类型详见:http://www.cplusplus.com/referen ... eam/operator%3E%3E/
istream::get 详见:http://www.cplusplus.com/reference/istream/istream/get/
还有一个 getline 函数,该函数是从文件中读取一行数据,什么是一行?所谓的一行就是有换行符 \n,或者达到 getline 的缓冲区大小,或者读到文件末尾。
istream::getline 详见:http://www.cplusplus.com/reference/istream/istream/getline/
所以,如果是想把文件中的内容一行一行的读进来,可以使用 getline 函数,还是非常方便的。
#include <fstream>
using namespace std;
int main(int argc, char* argv[])
{
short var = 20000;
ofstream fs_out;
fs_out.open("d:\\123.txt");
if (!fs_out) return 0;
fs_out << var << endl;
fs_out << var + 1 << endl;
fs_out << var + 2 << endl;
fs_out.close();
ifstream fs_in;
fs_in.open("d:\\123.txt");
if (!fs_in) return 0;
char sz[10] = { 0 };
fs_in.getline(sz, 10);
fs_in.getline(sz, 10);
fs_in.getline(sz, 10);
fs_in.close();
return 0;
}
②、读取二进制文件类型:read
#include <fstream>
using namespace std;
int main(int argc, char* argv[])
{
short var = 20000;
ofstream fs_out;
fs_out.open("d:\\123.txt");
if (!fs_out) return 0;
fs_out << var << endl;
fs_out << var + 1 << endl;
fs_out << var + 2 << endl;
fs_out.close();
ifstream fs_in;
fs_in.open("d:\\123.txt");
if (!fs_in) return 0;
char sz[100] = { 0 };
fs_in.read(sz, 100);
fs_in.close();
return 0;
}
具体 read 函数的定义见:http://www.cplusplus.com/reference/istream/istream/read/
也就是说他从指定的文件中读取数据,读取的数据可以是文本类型的也可以是二进制类型的,其实read也不管你想要读取什么东西,我只管读就是了,把读取到的内容放在第一个参数指针指向的内存中,具体读取的字节数就是靠第二个参数指定。
4、小作业:
今天给大家讲解了如何进行文件的读写,介绍了相关的读写文件的函数,那么今天给大家留的小作业就是如何判断读写文件的操作/函数是否成功了呢?以及如何判断是否读到文件末尾了呢?希望大家课后自己实践下!
第44课视频教程下载地址: