C++学习笔记_09 IO流 2021-04-26

简介: C++学习笔记_09 IO流 2021-04-26
//C++学习笔记_09 IO流 
#include<cstdio>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<fstream>
#include<sstream>
using namespace std;
void Test_iostream()
{
    //输出字符串到控制台, 怎么输出的?
    //把 "Hello world!" 这串数据,送到 cout 对象里面去 ==》 在控制台进行输出
    cout << "Hello world!" << endl;
    int x;
    //把cin对象中的数据,送到 x 里面来   ==》控制台输入数据 --> x 接受
    cin >> x;
    printf("x=%d\n", x); //输出10进制数
    printf("x=%x\n", x); //输出16进制
    cout << "x=" << x << endl; //默认输出10进制
    cout << "x=" << hex << x << "; " << dec << x << endl; //输出16进制  //八进制  oct //十进制 dec
}
void Test_fstream()
{
    //输出文件流 --> 把数据,从内存 输出到文件  --> 写文件操作
    ofstream ofs("a.txt"); //相对路径:默认使用当前程序路径
                           //我们也可以使用绝对路径  c:\xxx\a.txt
                           //使用绝对路径的时候要注意 \ 是转义字符
                           //我们应该写 ofstream ofs("c:\\xxx\\a.txt")
    if (ofs.is_open()){
        cout << "1 3 4 7 9" << endl; //输出给 cout
        ofs  << "1 3 4 7 9" << endl; //输出给 ofs
        ofs << "2 4 6 8 10" << endl;
        //写文件的时候,想把这一行,写到文件开头 --》使用 seekp 函数重新定位指针
        ofs.seekp(0, ios::beg); //第一个参数,表示偏移量: 负数-往前偏移, 正数-往后偏移
                                //第二个参数,表示基址:ios::beg 文件开始,ios::end 文件结尾, ios::cur 文件当前位置
        ofs << "1 2 3 4 5" << endl;//--》把原来的第一行 1 3 4 7 9 覆盖了
    }
    ofs.close();  //我们需要手动关闭文件,不会在析构函数里面关闭
                  //因为我们一个 ofs 可以多次打开文件
    ofs.open("b.txt");
    ofs << "hello world" << endl;
    ofs << "helloC++" << endl;
    ofs.close();
    //读文件:  文件输入流: 把数据输入到内存 
    ifstream  ifs("a.txt");
    int arr[5] = {0};
    int i = 0;
    if (ifs.is_open()){
        //我们想读第二行数据, 把文件偏移到第二行
        ifs.seekg(10, ios::beg);//get:读  //往后偏移 10 个 字符
        //判断文件末尾  ifs.eof() 返回ture 表示文件指针指到了结束位置
        while (!ifs.eof() && i < 5){
            //cin >> arr[i];
            ifs >> arr[i];i++;
        }
    }
    ifs.close();
    cout << "arr: ";
    for (i = 0; i < 5; i++) {cout << arr[i] << " ";}
    cout << endl << endl;
    //文件的打开方式:
    //ios::in   读文件
    //ios::out  写文件
    //ios::app  追加, 打开文件的时候,文件指针指到了文件末尾
    //ios::binary 二进制打开文件(二进制读写文件,文件不会失真)
    //ios::trunc  废弃当前文件内容:写文件的时候--》先清空文件再写
    char szBuf[100];
    //fstream fs("b.txt", ios::in | ios::trunc); //ios::in 和 ios::trunc 冲突
    fstream fs("b.txt", ios::in);
    //fs.good()  文件能正常操作 1, 否则为 0
    //fs.bad()   文件出错了 返回 1
    //如果遇到 bad 返回 1 ---》 fs.clear() 重置 --》重置后就可以重新打开文件进行操作了
    cout << "good? " << fs.good() << endl;
    cout << "bad ? " << fs.bad() << endl;
    if (fs.is_open()){
        //fs >> szBuf;
        //cout << "szBuf:" << szBuf << endl;
        fs << "HelloC++";
        //fs >> szBuf;
        //cout << "szBuf:" << szBuf << endl;
    }
    else  cout << "open file failed!" << endl << endl; 
    fs.close();
   //其它读写文件的方式
    //put(char) 函数, 在文件指针位置写一个字符
    char szStr[100] = "The end";
    fs.open("a.txt", ios::app);
    fs.put('E'); //写一个字符
    fs.write(szStr, strlen(szStr));  //写一段字符串
    fs.close();
    fs.open("b.txt", ios::in);
    fs.get(szStr, 100);  //可以读一段字符串, 最多读 100个字符,遇到 \n 结束
    cout << szStr << endl << endl;
    fs.seekg(0, ios::beg); //指针跳到文件开始位置
    fs.get(szStr, 100, '+'); //读一段字符,最多读100个字符,遇到 '+' 结束
    cout << szStr << endl << endl;
    fs.seekg(0, ios::beg);
    fs.read(szStr, 100);   //按块读取,读满 100 个字符 (除非到了文件末尾)
    cout << szStr << endl << endl;
    fs.close();
    return;
}
void Test_sstream()
{
    string ss("abcd");
    istringstream istrs(ss); //使用 ss 这个字符串初始化流 
    char szArr[10];
    istrs >> szArr;  //从字符串流中读取数据,类似与读写文件,不过这里是流数据在内存中 
    cout << "szArr:" << szArr << endl;//错误输出 有缓冲  
    cout << "istrs:" << istrs.str() << endl;//普通输出 无缓冲  
    ostringstream ostrs(ss);
    char szBuf[] = "Hello world";  
    ostrs << szBuf;  //把szBuf 写入到 字符串流,也就是写到了 ss 中
    cout << "ss   :" << ss << endl;
}
int main()
{
    //Test_iostream();
    //Test_fstream();
    Test_sstream();
    system("pause");
  return 0;
}
相关文章
|
2月前
|
网络协议 安全 Linux
Linux C/C++之IO多路复用(select)
这篇文章主要介绍了TCP的三次握手和四次挥手过程,TCP与UDP的区别,以及如何使用select函数实现IO多路复用,包括服务器监听多个客户端连接和简单聊天室场景的应用示例。
98 0
|
2月前
|
存储 Linux C语言
Linux C/C++之IO多路复用(aio)
这篇文章介绍了Linux中IO多路复用技术epoll和异步IO技术aio的区别、执行过程、编程模型以及具体的编程实现方式。
106 1
Linux C/C++之IO多路复用(aio)
|
4月前
|
C++
c++学习笔记07 结构体
C++结构体的详细学习笔记07,涵盖了结构体的定义、使用、数组、指针、嵌套、与函数的交互以及在结构体中使用const的示例和解释。
40 0
|
2月前
|
Linux C++
Linux C/C++之IO多路复用(poll,epoll)
这篇文章详细介绍了Linux下C/C++编程中IO多路复用的两种机制:poll和epoll,包括它们的比较、编程模型、函数原型以及如何使用这些机制实现服务器端和客户端之间的多个连接。
36 0
Linux C/C++之IO多路复用(poll,epoll)
|
3月前
|
安全 C语言 C++
C++学习笔记
C++学习笔记
|
4月前
|
C++
【学习笔记】【C/C++】 c++字面值常量
【学习笔记】【C/C++】 c++字面值常量
46 1
|
4月前
|
存储 C++
c++学习笔记05 函数
C++函数使用的详细学习笔记05,包括函数的基本格式、值传递、函数声明、以及如何在不同文件中组织函数代码的示例和技巧。
38 0
c++学习笔记05 函数
|
4月前
|
编译器 C++
【C/C++学习笔记】C++声明与定义以及头文件与源文件的用途
【C/C++学习笔记】C++声明与定义以及头文件与源文件的用途
58 0
|
4月前
|
存储 C++
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
51 0
|
4月前
|
C++
c++学习笔记09 引用
C++引用的详细学习笔记,解释了引用的概念、语法、使用注意事项以及引用与变量的关系。
44 0