实验目的和要求
1.掌握格式化的输入输出方法。
2.熟悉系统提供的输入操作函数。
3.掌握磁盘文件的输入输出方法。
实验内容
1.程序sy9_1.cpp用以打印表中的数据,但程序中存在逻辑错误。上机调试后写出正确的代码。
原程序如下:
-
//sy9_1.cpp
-
-
-
using namespace std;
-
int main()
-
{
-
int n[ 3][ 3]={{ 1, 2, 3},{ 4, 5, 6},{ 7, 8, 9}};
-
cout<<setw( 10)<<n[ 0][ 0]<<n[ 0][ 1]<<n[ 0][ 2]
-
<< endl<<n[ 1][ 0]<<n[ 1][ 1]<<n[ 1][ 2]
-
<< endl<<n[ 2][ 0]<<n[ 2][ 1]<<n[ 2][ 2]<< endl;
-
return 0;
-
}
修改后的程序如下:
-
//sy9_1.cpp
-
-
-
using namespace std;
-
int main()
-
{
-
int n[ 3][ 3]={{ 1, 2, 3},{ 4, 5, 6},{ 7, 8, 9}};
-
cout<<setw( 10)<<n[ 0][ 0]<<n[ 0][ 1]<<n[ 0][ 2]
-
<<setw( 10)<< endl<<n[ 1][ 0]<<n[ 1][ 1]<<n[ 1][ 2]
-
<<setw( 10)<< endl<<n[ 2][ 0]<<n[ 2][ 1]<<n[ 2][ 2]<< endl;
-
return 0;
-
}
2.编程实现下面要求:(sy9_2.cpp)
以左对齐方式输出整数40000,域宽为15。
打印有符号数和无符号数100。
将十进制整数100以0x开头的十六进制格式输出。
用前导*格式打印1.234,域宽为10。
编写程序如下:
-
//sy9_2.cpp
-
-
-
using namespace std;
-
int main()
-
{
-
double a= 40000;
-
cout<<setiosflags(ios_base::left)<<setw( 15)<<a<< endl;
-
cout<<showpos<< 100<< "\t"<< 100u<< endl;
-
cout.setf(ios::showbase);
-
cout<< "以0x开头的十六进制输出100:";
-
cout.setf(ios::hex,ios::basefield);
-
cout<< 100<< endl;
-
cout<<noshowpos<<right<<setfill( '*')<<setw( 10)<< 1.234<< endl;
-
return 0;
-
}
程序 输出结果如下:
3.建立某班同学通讯录二进制文件,文件中的每个记录包括姓名、电话号码、QQ号、E-mail和家庭住址。(sy9_3.cpp)
代码如下:
-
-
-
-
-
-
-
using namespace std;
-
static int n= 0;
-
class MYtel
-
{
-
public:
-
void getdata()
-
{
-
cin>>name>>number>>QQnum>>E>>add;
-
}
-
void disp()
-
{
-
cout<< "姓名\t\t电话号码\tQQ号码\t\tE-mail\t\t家庭住址"<< endl;
-
}
-
private:
-
char name[ 12];
-
char number[ 11];
-
char QQnum[ 11];
-
char E[ 10];
-
char add[ 100];
-
-
};
-
void fun1()
-
{
-
ofstream output("phone.dat",ios::binary);
-
if(!output)
-
{
-
cout<< "File cannot be opened."<< endl;
-
return ;
-
}
-
MYtel s;
-
cout<< "输入学生人数:";
-
cin>>n;
-
cout<< "姓名\t\t电话号码\tQQ号码\t\tE-mail\t\t家庭住址"<< endl;
-
for( int i= 0;i<n;i++)
-
{
-
s.getdata();
-
output.write(( char *)&s, sizeof(s));
-
}
-
output.close();
-
}
-
void fun2()
-
{
-
ifstream input("phone.data",ios::binary);
-
MYtel s;
-
cout<< "所有学生的信息为:"<< endl;
-
cout<< "姓名\t\t电话号码\tQQ号码\t\tE-mail\t\t家庭住址"<< endl;
-
input.read(( char *)&s, sizeof(s));
-
while(input)
-
{
-
s.disp();
-
input.read(( char *)&s, sizeof(s));
-
}
-
input.close();
-
}
-
-
int main()
-
{
-
int sel;
-
while( 1)
-
{
-
cout<< "********************通讯录系统*******************";
-
cout<< endl<< endl;
-
cout<< "1:输入数据 2.输出数据 0.退出"<< endl;
-
cout<< "**************************************************";
-
cout<< "\n请选择(0-3)";
-
cin>>sel;
-
switch(sel)
-
{
-
case 1:fun1(); break;
-
case 2:fun2(); break;
-
case 0: exit( 1);
-
}
-
}
-
return 0;
-
}
4.从键盘上输入学生的QQ号,在由第3题所建立的通讯录文件中查找该同学的资料。查找成功时,显示其所有通讯录信息。(sy9_4.cpp)
代码如下:
分析与讨论
1.结合实验内容中第1题和第2题,说明格式化的输入输出方法和应注意的问题。
答:C++的I/O流库提供了两种控制格式的输入输出的方法:一种是iOS类的成员函数,另一种是使用控制符;
在iOS类中有几个成员函数可用来对输入输出的格式控制,这些成员函数通过对格式标志字、域宽、填充符及输出精度的设定来控制输入输出的格式,使其后的输入输出操作按设定的格式进行;C++的I/O流类库中又提供一种使用控制符进行格式化输出的方法,这些控制符与成员函数调用的效果一样,它们可以直接插入到流中,而不必再单独调用,也可直接被插入符或提取符操作。但控制符中没有的功能还需使用成员函数的方法来提供。这些控制符是一些特殊的函数,其中所有不带形式参数的函数是在头文件iostream.h中定义的,而所有带形式参数的函数定义则定义在iomanip.h中,如第1题中的set(10)和第2题中的set(10)就是在iomanip.h中定义的。
应注意的问题:数据输出宽度在默认情况下为表示该数据所需的最少字符数;如果所设置的数据宽度小于数据所需的最少字符数,则数据宽度按默认宽度处理。
2.结合实验内容中第3题和第4题,说明磁盘文件的输入输出方法。
答:按数据的存储形式来分类,文件可分为文本文件和二进制文件。按数据的存取方式来分类,文件可分为顺序文件和随机读取文件。
文件的打开和关闭方法:
打开文件就是使一个文件流对象与一个指定的文件相关联。对象名.open(文件名,方式);
文件在打开后可进行读写操作,在读写操作完成后应将其关闭,就是使打开的文件与流对象“脱钩”。
<流对象名>.close();
实验总结
在本次实验中我学会了格式化的输入输出方法,知道怎样去设置输出格式的对齐方式,输出的数据宽度,填充字符和输出精度等;还知道了所有不带形式参数的函数是在头文件iostream.h中定义的,而所有带形式参数的函数定义则定义在iomanip.h中。