系列文章目录
【C++基础】面向对象方法(一)
【C++基础】面向对象方法(二)
【C++基础】面向对象方法(三)
【C++基础】面向对象方法(四)
【C++基础】面向对象方法(五)
【C++基础】面向对象方法(六)
【C++基础】面向对象方法(七)
【C++基础】面向对象方法(八)
【C++基础】面向对象方法(九)
【C++基础】面向对象方法(十)
一、write()函数
write()函数,输出流提供了用于输出一个数据块的成员函数write(),输出流对象可以调用这个函数实现向输出设备输出指定个数的多个字符的操作。
输出流类提供了用于输出一个数据块的成员函数write(),输出流对象可以调用这个函数实现向输出设备输出指定个数的多个字符的操作。write()函数有2个参数,其调用格式为:
out.write(字符型指针,字节数n)
其中out是输出流对象。
函数调用时,将指定字符型地址中连续n个字节的数据输出到输出设备。函数以引用方式返回调用该函数所使用的输出流对象out,因此支持连续调用,如
out.write("abc",3).write("de",2);
(1)使用write()函数进行标准输出
例1:使用write()函数进行标准输出
代码如下(示例):
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
char* ch = "允公允能 日新月异";
cout.write(ch, 8).put('\n');//输出前8个字符
cout.write(ch, strlen(ch)) << endl;//输出全部字符
return 0;
}
(2)使用write()函数进行标准输出
例2:使用write()函数进行二进制文件输出
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
double a = 123.45;
fstream outascii("file4.txt", ios::out);
fstream outbin("file4.dat", ios::binary|ios::out);
outascii << a; //将变量a输出到文本文件中
//用write()函数将变量a输出到二进制文件中
outbin.write((char*)&a, sizeof(a));
outbin.close();
outascii.close();
return 0;
}
问题:下边的代码生成的文件用记事本打开是乱码吗?
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
double a = 123.45;
fstream outbin("file5.dat", ios::binary | ios::out);
outbin << a;//将变量a输出到二进制文件中,不是乱码!
outbin.close();
return 0;
}
二、read()函数
输入流类提供了用于输入一个数据块的成员函数read(),输入流对象可以调用这个函数实现从文件输入指定个数的多个字符的操作。
read()函数有2个参数,其调用格式为:in.read(字符型指针,字节数n)
其中,in是输入流对象,字符型指针所指向的必须是可修改的内存空间。函数调用时,从输入设备读取n个字符,存入字符型指针所指向的内存空间中。若在读取够n个字符前遇到EOF,则提前结束读取。若读取成功,函数返回值为真(非0),若读取失败(遇到文件结束符EOF),函数返回值为假(0)值。
(1)使用read()函数进行标准输入
代码如下(示例):
#include<iostream>
#include<fstream>
using namespace std;
//使用read()函数进行标准输入
int main()
{
char s[80];
int i;
cout << "请输入字符串:" << endl;
cin.read(s, 12);//从键盘读取前12个字符到数组s中
cout << "读取的字符是:";
for (i = 0; i < 12; i++)
cout << s[i];
cout << endl;
cout << "读取的字符个数是:";
cout << cin.gcount() << endl;
return 0;
}
- read()函数能够读取空白字符。
- read()函数读取指定个数的字符、而不是字符串,最后不会自动加字符串结束符’\0’。
(2)使用read()函数进行二进制文件输入
例4:先向二进制文件中写入整型数据1-10,再将10个数从文件读出并输出到屏幕上
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
fstream iofile("file6.dat", ios::binary | ios::out);
if (!iofile.is_open())
{
cout << "以写方式打开二进制文件file.dat失败!";
return 0;
}
int a;
for (a = 1; a <= 10; a++)//将数字输出到文件file.dat中
iofile.write((char*)&a, sizeof(a));
iofile.close();
iofile.open("file6.dat", ios::binary | ios::in);
if (!iofile.is_open())
{
cout << "以读方式打开二进制文件file.dat失败!";
return 0;
}
while (iofile.read((char*)&a, sizeof(a)))
cout << a << ' ';
iofile.close();
return 0;
}
三、按数据块进行输入输出
例:程序首先将3名学生的学号、姓名和成绩写入二进制文件studeninfo.dat中,然后将该文件中的数据读到结构体数组中,并将其输出到屏幕上。
代码如下(示例):
#include<iostream>
#include<fstream>
using namespace std;
struct Student
{
char num[10];
char name[20];
int score;
};
int main()
{
Student stu[3] =
{
{"1210101","张三",618},
{"1210102","李四",625},
{"1210103","王五",612}
};
int i;
fstream iofile("studentinfo.dat", ios::binary | ios::out);
if (!iofile.is_open())
{
cout << "以写方式打开二进制文件studentinfo.dat失败!";
return 0;
}
for (i = 0; i < 3; i++)
iofile.write((char*)&stu[i], sizeof(Student));
iofile.close();
iofile.open("studentinfo.dat", ios::binary | ios::in);
if (!iofile.is_open())
{
cout << "以读方式打开二进制文件studentinfo.dat失败!";
return 0;
}
//将3名学生数据一次性读入到内存中
iofile.read((char*)stu, sizeof(stu));
for (i = 0; i < 3; i++)
cout << "第" << i + 1 << "名学生的学号、姓名和成绩:"
<< stu[i].num << "," << stu[i].name << "," << stu[i].score << endl;
iofile.close();
return 0;
}
总结
以上就是今天记录的内容,本文仅仅简单介绍了write()函数、read()函数、按数据块进行输入输出。