c++中的输入、输出和文件流

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zouxu634866/article/details/88139382

前言:最近又拾起了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.单字符输入检测

扫描二维码关注公众号,回复: 5958296 查看本文章

这种方法就是依次打印输入的字符,但是输入时是输入的字符串,所以这种方法也就是一个一个检测你输出的字符是否符合你的要求,直到检测到不符合的。此时用到的函数是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;
}

猜你喜欢

转载自blog.csdn.net/zouxu634866/article/details/88139382