• C++day13 学习笔记


    1、数据  内存中  变量
             磁盘上  文件

    2、把数据从其他的设备搬到内存中 --- 输入 --- 读
       把内存中的数据放到其他设备中 --- 输出 --- 写

    3、流
       物质的定向移动,输入输出流中是数据的定向移动
       输入流的源头 : 文件       目的地:内存
       输出流的源头 : 内存       目的地:文件

    4、标准输出设备 --- 显示器
       标准输入设备 --- 键盘
      
        键盘 --- 内存 --- 显示器
              |        |
          输入操作   输出操作           
         
       输入输出流 : 内存与磁盘之间,内存与标准输入输出设备之间的

    5、cout  源 :变量       目的地 :显示器 
       cin        键盘                内存中某一变量
      
    6、标准输入流 cin   istream的一个对象
       标准输出流 cout  ostream的一个对象
       标准错误流 cerr 目的地都是屏幕,用cout替代

    7、cin
        是一个带有缓冲的标准的输入对象,默认输入设备是键盘
      (1) >>  : 自动校验数据类型  
                  遇到回车才会开始读数据,遇到空格就结束,只能读一个单词
                  流是数据的定向移动,被读走的数据就消失,没有读走的数据会一直留在流中,直到流的消失,数据也跟着消失
                  流中有数据,就会阻塞,等待读取  ---  所有输入方法的特性
                  为什么 ">>"可以连续使用? 因为返回就是istream对象本身的引用
                  注意 : ">>" 不读回车,不读空格
      (2)get(): 每次 读一个字符。返回一个整数,实际上是读到字符的ASCII码
                    把回车,空格都当作普通字符读出来
      (3)get(char&):把读到的内容存到参数中               
                      cin.get(arr[0]).get(arr[1]);  //get(char&)返回cin本身,可以连续使用
     (4)getline(str,256) : 读取一行,包括空格
              对于回车,只读走,不保存
              会读取数组长度减1个字符,最后一个放'\0'
                       输入数据超过给定的空间 (1)截断数据,剩下的数据还在流里
                                              (2)设置一个错误标记,调用cin.clear(),清除错误,继续工作

    View Code
       #include <iostream>
       using namespace std;
    
       int main(){
            int age;
            char name[20] ;
            cout << "enter your age >";
            cin >> age;
            cin.get();            //读取流中残余的回车,以便getline能正常工作
            // cin.ignore(20,'\n');  //忽略20个字符或者碰到回车,从流中清除
            cout << "enter your name >";
            cin.getline(name,20);
            cout << "your age is :" << age << endl;
            cout << "your name is :" << name << endl;
       } 

      (5)read(char*,int)   char*是存结果的地址,int是读的长度,并且不能比前面的数组的空间大
                             读满为止 ,特殊字符也当做普通字符处理
                             超出的部分仍然存在流里面
                             只要数据没读满,一直阻塞
                             不会自动补'\0' --- 传参数的时候,数组长度传减1的长度,补齐'\0'以免乱码
                            
       所有输入流的共同特征:只要没数据就阻塞
                             读不完的就留在流里                                        
                            
      (6)cin.ignore(255,'\n')  忽略255个字符或者遇到'\n',如果在前255个字符中出现'\n',则就忽略到'\n'之前的字符                        
      (7)peek()  查看流里的第一个字符是什么
                   只察看,不读走
      (8)putback() 向流中插入字符,前提必须有空位的时候
                     必须与get()一起使用,用get()取出一个字符,才能用putback()插入一个字符
      (9)cin.fail()判断是否出现错误标志,一切正常返回false

      当用cin读取的数据类型出现错误的时候,这是一种不可恢复的错误,用cin.clear()是不能清除错误标记的
      在键盘上读取,用getline()可以确保输入流的正常形成,读取后采取强制转换类型得到自己需要的数据

    8、ifstream
       (1)需要#include <fstream>头文件
          ifstream ifs("test.txt");  //创建一个ifstream的对象,打开文件,给构造函数传如一个参数,就是文要打开的文件名 
          //文件的在当前目录下找,也可以用相对路径或绝对路径找文件
          在打开文件之后,立即判断打开文件是否成功

          if( ifs.fail() ){
             cout << "Can't open test " <<endl;
             return 0;
          }
          
          if( ! ifs ){    //也可以这样判断文件打开是否出错
             cout << "Can't open test " <<endl;
             return 0;
          }

       (2)在文件结束的时候都会有"EOF"标志,作为文件结束的标志符
          可以用判断是否读到"EOF",来判断时候读到文件尾了

          if(ifs.eof()){
             break;
          }

       (3)对于一个进程可打开文件的数量是有数的,所以文件属于资源
          所以在使用完毕以后,要关闭文件输入流     
         
       练习:(1)把/etc/passwd 文件打印出来
             (2)把文件中不以"#"开头的内容读出来
                peek(),ignore()
               
    9、输出操作cout
       (1) << 操作 被输出到屏幕上的东西,只所以能输出,都是以字符串类型输出
                     也就是说这个操作有自动类型转换的功能
       (2)put()   返回cout引用,可以连续调用           
       (3)write(buf,len)  按指定长度写到屏幕上 buf是char*类型
       (4)cout.width(10); 打印的内容总共占10个字符,并靠右对齐
                            只对其后边的一个cout生效
       (5)cout.fill('#'); 用'#'补齐空位
                            主要调用一次,对以后的都生效      
       (6)setf()操作,控制格式,教材188页                                        
      
       (7)特殊字符
            '\r'  表示回退一个格,再输出
            '\n'  回车
            \\    输出一个'\',因为'\'会被认为是转义字符
            '\t'  一个tab键
           
       (8)输出控制符
            oct    按八进制输出  “0”
            dec    使进制输出
            hex    按十六进制输出 “0x”
            flush  清空缓冲区 带缓冲区是因为和外部设备交涉,这样能减少向屏幕输出的次数,提高效率
                   回车、程序结束和flush都是刷新缓存的命令
                   cout << "a" <<flush ;

    10、ofstream
        打开文件,把数据写进文件,关闭文件

        ofstream ofs("ofstream.txt");   //打开文件,若文件不存在,创建,存在,打开
        if(ofs.fail()){                 //写文件失败,一般是权限问题
             cout << "open file error "<<endl;
             return 0;
        }

        在iostream头文件中cin cout对象已经被声明,可以直接使用,因为标准输入输出设备是唯一的,系统声明
        但是fstream的对象要程序员来声明,因为对文件的输入输出是不唯一的
       
         ofstream ofs("ofstream.txt" , ios::app);  //以追加的形式向文件中写
         ios::trunc 默认方式  把文件内容清空,写新的文件
         ios::nocreate  不创建新文件
         ios::noreplace  不改写,要创建新文件
         组合多个 ofstream ofs("ofstream.txt" , ios::app | ios::in | ios::binary);
        
    11、读写二进制文件
        (1)ios::binary
        (2)read/write 方法读写二进制文件,因为这两个方法只需要起始位置和大小就可以工作
       
         
    作业:(1)int readInt(){}
               double readDouble(){}
               强转函数,要求容错能力强,要求有可靠的手段通知用户是否出错                                
          (2)根据用户输入的用户名,打印他的用户id,home,shell,如果用户不存在,通知用户
               strtok(),strcmp()

  • 相关阅读:
    【洛谷P5305】旧词
    【洛谷P5470】序列
    【CF865D】Buy Low Sell High
    【洛谷P3242】接水果
    【洛谷P5048】Yuno loves sqrt technology III
    一、Java语言基础(1)_走进java——JDK-JRE-JVM概述
    一、Java语言基础(1)_走进java——跨平台/可移植性
    第一阶段:前端开发_JavaScript基础
    第一阶段:前端开发_HTML表单&CSS
    第一阶段:前端开发_HTML&CSS
  • 原文地址:https://www.cnblogs.com/tangzhengyue/p/2622624.html
Copyright © 2020-2023  润新知