十、C++之文件操作

 

一、标准输入流(cin)

1.1 cin的常见用法

/*
cin.get()          一次只能读取一个字符
cin.get(一个参数)  读一个字符
cin.get(两个参数)  可以读取字符串, 读取字符串不会读取换行,遗留在缓冲区
cin.getline()     会读取换行符,但是会把换行符给扔掉
cin.ignore()      忽略,代表忽略字符 cin.ignore(N); 代表忽略N个字符
cin.peek()        偷窥, 偷看一眼获取的字符,然后再放回缓冲区,缓冲区中的数据未变
cin.putback()     放回, 读取之后把字符放回缓冲区
*/

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
using namespace std;

// cin.get()  一次只能读取一个字符
void test01()
{
    char c = cin.get();          // as   
    cout << "c = " << c << endl; // a
    c = cin.get();
    cout << "c = " << c << endl; // s
    cout << "c = " << c << endl; // \n
}

// cin.get(两个参数), 可以读取字符串, 读取字符串不会读取换行,遗留在缓冲区
void test02()
{
    char buf[1024];
    cin.get(buf, 1024);              // hello world
    char c = cin.get();
    if (c == '\n')
    {
        cout << "换行还在缓冲区" << endl; // 换行还在缓冲区
    }
    else
    {
        cout << "换行不在缓冲区" << endl;
    }
    cout << "bug = " << buf << endl; // hello world
}

// cin.getline()  会读取换行符,但是会把换行符给扔掉
void test03()
{
    char buf[1024];
    cin.getline(buf, 1024);
    char c = cin.get();  // 阻塞在这里,等待输入
}


// cin.ignore() 忽略,代表忽略字符 cin.ignore(N); 代表忽略N个字符
void test04()
{
    cin.ignore();                 // as
    char c = cin.get();
    cout << "c = " << c << endl;  // s
}

// cin.peek() 偷窥, 偷看一眼获取的字符,然后再放回缓冲区,缓冲区中的数据未变
void test05()
{
    char c = cin.peek();         // as
    cout << "c = " << c << endl; // c = a
    c = cin.get();
    cout << "c = " << c << endl; // c = a
}

// cin.putback() 放回
void test06()
{
    char c = cin.get();  // hello world
    cin.putback(c);
    char buf[1024];
    cin.getline(buf, 1024);
    cout << "buf = " << buf << endl; // buf = hello world
}


int main()
{
    // test01();
    // test02();
    // test03();
    // test04();
    // test05();
    test06();
    return EXIT_SUCCESS;
}

 

1.2 案例

1.2.1 判断用户输入的是字符串还是数字

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
using namespace std;

// 案例一、判断用户输入的是字符串还是数字
void test()
{
    cout << "请输入一串数字或者字符串" << endl;
    // 判断第一个字符是字符还是数字
    char c = cin.peek();
    if (c >= '0' & c <= '9')
    {
        int num;
        cin >> num;
        cout << "输入的是数字, 输入的数字是: " << num << endl;
    }
    else
    {
        char buf[1024];
        cin >> buf;
        cout << "输入的是字符串, 字符串为: " << buf << endl;
    }
}


int main()
{
    test();
    return EXIT_SUCCESS;
}

 

1.2.2 重置标志位

/*
    cin.clear()   重置标志位
    cin.fail()    查看标志位
*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
using namespace std;

// 让用户输入 1-10的数字,如果输入有误,重新输入
void test()
{
    int num;
    cout << "请输入一个 1 - 10 的数字" << endl;
    while (true)
    {
        cin >> num;  //  如果输入的是 字符的话, 那么标志位是 1,就会进入死循环,所以要重置标志位
        if (num > 0 && num <= 10)
        {
            cout << "输入的数字为: " << num << endl;
            break;
        }
        // 重置标志位
        cin.clear();
        cout << "cin 输入 int 类型的标志位: "<< cin.fail() << endl;  // 输入 int 类型的标志位: 0. 如果输入的是字符,标志位是 1,没有重置标志位,就会死循环    
    }    
}

int main()
{
    test();
    return EXIT_SUCCESS;
}

 

二、标准输出流(cout)

2.1 cout的使用

/*
    cout.put();  向缓冲区写字符
    cout.write();  从 buffer中写num个字节到当前输出流中
*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
using namespace std;

// cout.put();  向缓冲区写字符
void test01()
{
    cout.put('a').put('b');  // ab
}

// cout.write()  从 buffer中写num个字节到当前输出流中
void test02()
{
    char buf[1024] = "hello world";
    cout.write(buf, strlen(buf));   // hello world
}


int main()
{
    test01();
    test02();
    return EXIT_SUCCESS;
}

2.2 cout 的流成员函数

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
using namespace std;

// 流成员函数
void test()
{
    int num = 99;
    cout.width(20);             // 20个字节的区域, 数字在最右侧
    cout.fill('*');             // 用 * 填充空格
    cout.setf(ios::left);       // 设置格式, 输出的内容左对齐       
    cout.unsetf(ios::dec);      // 卸载十进制
    cout.setf(ios::hex);        // 安装了十六进制,十六进制下的 99
    cout.setf(ios::showbase);   // 强制输出整数的基数  0   0x
    cout.setf(ios::hex);        // 同理 八进制
    cout.setf(ios::oct);        // 同理十进制
    cout << "num = " << num << endl;
}

int main()
{
    test();
    return EXIT_SUCCESS;
}

 

2.3 控制符格式化输出

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
#include<iomanip>    // 使用控制符的头文件
using namespace std;

void test()
{
    int num = 99;
    cout << setw(20)
        << setfill('~')
        << setiosflags(ios::showbase)
        << setiosflags(ios::left)
        << hex
        << num
        << endl;
}

int main()
{
    test();

    return EXIT_SUCCESS;
}

 

 

三、文件读写操作

/*
    写文件:  ofstream
    读文件:  ifstream
*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
#include<fstream>
using namespace std;

// 写文件
void test01()
{
    // 以输出的方式打开文件, 方式一
    // ofstream ofs("1.txt", ios::out | ios::trunc);
    // 方式二
    ofstream ofs;
    ofs.open("1.txt", ios::out | ios::trunc);

    // 判断是否打开成功
    if (!ofs.is_open())
    {
        cout << "打开失败" << endl;
    }
    ofs << "姓名:王勇" << endl;
    ofs << "年龄:27" << endl;
    ofs.close();
}

// 读文件
void test02()
{
    ifstream ifs;
    ifs.open("1.txt", ios::in);
    // 判断是否打开成功
    if (!ifs.is_open())
    {
        cout << "打开失败" << endl;
     }
    // 第一种方式 推荐
    //char buf1[1024];
    //while (ifs>>buf1) // 按行读取
    //{
    //    cout << buf1 << endl;
    //}

    // 第二种方式 不推荐
    //char buf2[1024];
    //while (!ifs.eof()) // eof读到文件末尾
    //{
    //    ifs.getline(buf2, sizeof(buf2));
    //    cout << buf2 << endl;
    //}

    // 第三种方式 更不推荐
    char c;
    while ((c = ifs.get()) != EOF)  // EOF 文件尾
    {
        cout << c;
    }
    ifs.cloase();
}

int main()
{
    test01();
    test02();
    return EXIT_SUCCESS;
}

 

posted on 2022-03-20 15:46  软饭攻城狮  阅读(34)  评论(0编辑  收藏  举报

导航