前言:最近又拾起了c++ primer plus,于是学习了这一章,于是写下博客记录以前忽略的。
第一节:cout
1.关于cout的输出精度,系统默认的是6,也就是显示的总位数,但是如果末尾的数字为0,会省略,比如13.2000的精度为6,但是打印出来为13.2, 0被省略
所以如果我们想要修改精度,怎么修改?在cout前用语句:
cout.precison(x);//x为想要的精度
比如x=2,此时13.2输出就为13;
2.前面提到了精度,但是会省略末尾的0,如果我们不想省略0,怎么办?此时在cout前面用语句:
cout.setf(ios_base::showpoint);
这样如果我们13.2000输出就为13.2000.
提示:上面的第一点和第二点可以一起用。0.0
第二节:cin(主要学习如何检查输入)
我们假如 a 为 int ,此时我们cin 》a ;如果我们输入的是 12.3,那么a为多少呢?此时a为12,因为cin将依次读入你的字符,直到遇到不合法的或者回车,所以遇到.时就停止了。或者输入12g,此时a还为12。
另外,cin 这句话会返回true和faulse,当cin给a输出的值符合规定,返回true,否则返回fause。但是上面的12.3和12g是符合规定的,因为a有值,但是hdsh就不行,因为a没有任何值。所以利用这一点就可以放进if和while中间
cin>> 虽然也可以输入字符串,但是cin>>无法输入空格,它默认空格也是终止符,和空格一样,比如:
char a[100];
cin>> a;
cout << a;//当你输入zx is a student,此时只传入zx给a!!!!
1.单字符输入检测
这种方法就是依次打印输入的字符,但是输入时是输入的字符串,所以这种方法也就是一个一个检测你输出的字符是否符合你的要求,直到检测到不符合的。此时用到的函数是cin的成员函数get(char &)和get();
先说get(char &),这个函数是从你输入的字符传中,从第一个字符开始,赋值给参数,然后以后每执行一次这句话,跳到下个字符。
比如:
int main()
{
char a;
cin.get(a); //将第一个字符赋值给参数a
while(a != '\n') //检测a是不是回车
{
cout << a; //不是回车就打印这个字符
cin.get(a); //在执行这句话跳到下一个字符
}
return 0;
}
所以这个程序就可以检测你输入的字符串,打印回车前你输入的字符串。
再说get(),他和上面的get(char &)一样,只不过是将返回值返给参数。用法如下:
int main()
{
char a;
a= cin.get();//将第一个字符返回给参数a
while(a != '\n') //检测a是不是回车
{
cout << a; //不是回车就打印这个字符
a=cin.get(); //在执行这句话跳到下一个字符
}
return 0;
}
所以,上面我们可以把回车改为某一个字符,比如‘b’。此时就是检测你输入的字符串,直到检测到有b时就停止打印。
另外,这两个函数也是书中提倡的输入。
2.字符串输入
前面提到过cin》这个不能输入空格,所以如果你想输入一串含有空格的字符串怎么办?
用:get()成员函数
用法:
char a[100];
cin.get(a,100); //第一个参数是你要传入的字符数组,第二个参数和你的a的大小一样。
cout << a;//当你输入zx is a student,此时就完美打印
注意: cin.get(a,100);
这个函数遇到回车就会终止,如果你想要指定其他的终止符,可以引入第三个参数: cin.get(a,100,‘b’);
,此时就表示当遇到b时就终止传入。
总结:
1.cin>> 不能输入空格,但是cin.get()可以输入空格。另外cin.get()既可以单字符输入也可以字符串输入,看的是参数的形式。
2.上面的两种方法都可以用于检测,一种是一个一个输入一个一个检测,另外一个是直接传入字符串直到遇到你规定的终止符
第三节:文件操作
进行c++的文件操作,需要包含头文件 #include <fstream>
,这是文件操作的头文件,包含文件操作的各种流。写入文件,就需要创建一个ofstream对象,使用<<往里面写入内容。要读取文件,需要创建一个ifstream对象,使用get()函数取出内容,这里用的get函数也是每执行一次获取一个字符。
写入文件步骤:
1.创建一个ofstream对象
2.将该对象和相关的文件对应起来。也就是打开文件,使用open函数。
3.使用<<往里面写东西
4.使用close()关闭对象。
注意:以这种方法打开的文件,如果没有这个文件,会创建一个。如果有这个文件,会首先清空他!!后面会将如何追加写入
读取文件操作:
1.创建一个ifstream对象
2.将该对象和相关的文件对应起来。也就是打开文件,使用open函数。
3.使用get()函数或者getline()获取内容
4.使用close()关闭对象。
注意:关于读取内容时,我们通常是将内容读取出来赋值给另外一个字符或者字符串,如果想要赋值给一个字符,可以用下面的形式来打印内容
while(file2.get(a))//因为get(a)只要不是末尾就返回true
{
cout << a;
}
也可以读取一排:
char buff【1000】;
file2.getline(buff,100);
下面附上一个完整的代码,包含了打开一个文件并且写入后显示出来:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
string filename; //创建的文件名自己输入
cout << "please enter name for new file:";
cin >> filename;
ofstream file;
file.open(filename.c_str()); //这里c_str()将输入的文件名转换为标准的c风格
file << "this is your eye" << endl;
float a;
cout << "enter your secret number:";
cin >> a;
file << "your secret number is " << a << endl;
file.close();
ifstream file2;
file2.open(filename.c_str());
cout << "the follwing is the content:"<< endl;
char b;
while(file2.get(b))
{
cout << b;
}
cout << "Done!"<<endl;
file2.close();
return 0;
}
注意:我们再利用ifstream进行文件的读取操作时,如果这个文件不存在,是没法读取的,所以在执行完读取文件时的open函数后,需要检查一下是否打开成功了。做法就是:
ifstream file2;
file2.open(filename.c_str());
if( ! file2.is_open()) //is_open()就是判断是否打开,前面加了!就是没有打开。
{
..........
}
打开多个文件
程序有时在读取文件时可能需要打开多个文件,我们可以定义多个ifstream对象,分别关联(open)各自的文件,除此之外,我们也可以定义一个对象,然后关联(open)第一个文件,对第一个文件进行相关的处理,完了后close,clear。然后再将这个对象关联(open)第二个文件。。。。。依次下去处理接下来的文件。第二种的效率更高。但是之后我们将要学习一种新的技术来读取文件,即让程序能够使用循环来处理文件。
追加文件
前面提到过当我们用ofstream打开文件进行写入时,是覆盖写入,如果想要追加写入,可以再open里面加入参数。
用:
ofstream ofile;
ofile.open(name.c_str(),ios::out | ios::app); //之前没有后面这个参数,但是默认的是ios::out,即输出模式,这里因为为追加写入,所以要加入新的参数:ios::app
配上例子:
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
using namespace std;
const string name = "test_file13.txt"; //the file name
int main()
{
//show initial content
char ch;
ifstream ifile;
ifile.open(name.c_str());
if(ifile.is_open())
{
cout << '\n'<<"here are the current contents of the" << name <<":"<<endl;
while(ifile.get(ch))
{
cout << ch;
}
ifile.close();
}
//add new content
ofstream ofile;
ofile.open(name.c_str(),ios::out|ios::app);
if(!ofile.is_open())
{
cout << "can not open" << name <<endl;
}
if(ofile.is_open())
{
char a;
cout <<'\n'<< "please enter your content:";
a = cin.get(); //注意这里:这里就是将用户的输入写入文件,用的方法就是一个一个写入,直到遇到回车。
while(a != '\n')
{
ofile << a;
a = cin.get();
}
ofile << endl;
ofile.close();
}
//show revised file
ifile.open(name.c_str());
if(ifile.is_open())
{
cout <<'\n'<< "here are the current contents of the" << name <<":"<<endl;
while(ifile.get(ch))
{
cout << ch;
}
ifile.close();
cout << endl;
}
return 0;
}