精华内容
下载资源
问答
  • 【C++】输入流和输出

    千次阅读 2019-07-15 00:15:21
    【C++】输入流和输出流一. 流的概念和流类库的结构二. 标准I/O流三. 标准输入流四. 标准输出流1. 字符输出2. 格式化输出五. 文件读写1. 文件流类和文件流对象2. C++打开文件3. C++关闭文件4. C++对ASCII文件的读写...

    一. 流的概念和流类库的结构

    程序的输入指的是从输入文件将数据传送给程序,程序的输出指的是从程序将数据传送给输出文件。

    • C++输入输出包含以下三个方面的内容:
    1. 对系统指定的标准设备的输入和输出。即从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准的输入输出,简称标准I/O。
    2. 以外存磁盘文件为对象进行输入和输出,即从磁盘文件输入数据,数据输出到磁盘文件。以外存文件为对象的输入输出称为文件的输入输出,简称文件I/O。
    3. 对内存中指定的空间进行输入和输出。通常指定一个字符数组作为存储空间(实际上可以利用该空间存储任何信息)。这种输入和输出称为字符串输入输出,简称串I/O。

    C++编译系统提供了用于输入输出的iostream类库。iostream这个单词是由3个部 分组成的,即i-o-stream,意为输入输出流。在iostream类库中包含许多用于输入输出的 类。
    常用的见表:

    在这里插入图片描述
    ios是抽象基类,由它派生出istream类和ostream类,两个类名中第1个字母i和o分别代表输入(input)和输出(output)。 istream类支持输入操作,ostream类支持输出操作, iostream类支持输入输出操作。iostream类是从istream类和ostream类通过多重继承而派生的类。其继承层次见上图表示。

    C++对文件的输入输出需要用ifstrcam和ofstream类,两个类名中第1个字母i和o分别代表输入和输出,第2个字母f代表文件 (file)。ifstream支持对文件的输入操作, ofstream支持对文件的输出操作。类ifstream继承了类istream,类ofstream继承了类ostream,类fstream继承了 类iostream。见图

    I/O类库中还有其他一些类,但是对于一般用户来说,以上这些已能满足需要了。

    • 与iostream类库有关的头文件
      iostream类库中不同的类的声明被放在不同的头文件中,用户在自己的程序中用#include命令包含了有关的头文件就相当于在本程序中声明了所需 要用到的类。可以换 —种说法:头文件是程序与类库的接口,iostream类库的接口分别由不同的头文件来实现。常用的有:
    头文件名 常用功能
    iostream 包含了对输入输出流进行操作所需的基本信息。
    fstream 用于用户管理的文件的I/O操作。
    strstream 用于字符串流I/O。
    stdiostream 用于混合使用C和C + +的I/O机制时,例如想将C程序转变为C++程序。
    iomanip 在使用格式化I/O时应包含此头文件。
    • 在iostream头文件中定义的流对象
      在 iostream 头文件中定义的类有 ios,istream,ostream,iostream,istream 等。
      在iostream头文件中不仅定义了有关的类,还定义了4种流对象。
    对象 含义 对应设备 对应的类 c语言中相应的标准文件
    cin 标准输入流 键盘 istream_withassign stdin
    cout 标准输出流 屏幕 ostream_withassign stdout
    cerr 标准错误流 屏幕 ostream_withassign stderr
    clog 标准错误流 屏幕 ostream_withassign stderr

    在iostream头文件中定义以上4个流对象用以下的形式(以cout为例):
    ostream cout ( stdout);
    在定义cout为ostream流类对象时,把标准输出设备stdout作为参数,这样它就与标准输出设备(显示器)联系起来,如果有
    cout <<3;
    就会在显示器的屏幕上输出3。

    在iostream头文件中重载运算符
    “<<”和“>>”本来在C++中是被定义为左位移运算符和右位移运算符的,由于在iostream头文件中对它们进行了重载, 使它们能用作标准类型数据的输入和输出运算符。所以,在用它们的程序中必须用#include命令把iostream包含到程序中。

    #include <iostream>
    >>a 表示将数据放入a对象中。
    <<a 表示将a对象中存储的数据拿出。
    

    二. 标准I/O流

    标准I/O对象:cin,cout,cerr,clog

    • cout流对象
      cout是console output的缩写,意为在控制台(终端显示器)的输出。强调几点。
    1. cout不是C++预定义的关键字,它是ostream流类的对象,在iostream中定义。 顾名思义,流是流动的数据,cout流是流向显示器的数据。cout流中的数据是用流插入运算符“<<”顺序加入的。如果有:
      cout<<"I "<<"study C++ "<<“very hard. << “hello world !”;
      按顺序将字符串"I ", "study C++ ", "very hard.“插人到cout流中,cout就将它们送到显示器,在显示器上输出字符串"I study C++ very hard.”。cout流是容纳数据的载体,它并不是一个运算符。人们关心的是cout流中的内容,也就是向显示器输出什么。

    2. 用“cout<<”输出基本类型的数据时,可以不必考虑数据是什么类型,系统会判断数据的类型,并根据其类型选择调用与之匹配的运算符重 载函数。这个过程都是自动的,用户不必干预。如果在C语言中用prinf函数输出不同类型的数据,必须分别指定相应 的输出格式符,十分麻烦,而且容易出错。C++的I/O机制对用户来说,显然是方便 而安全的。

    3. cout流在内存中对应开辟了一个缓冲区,用来存放流中的数据,当向cout流插人一个endl时,不论缓冲区是否已满,都立即输出流中所有数据,然后插入一个换行符, 并刷新流(清空缓冲区)。注意如果插人一个换行符”\n“(如cout<<a<<"\n"),则只输出和换行,而不刷新cout 流(但并不是所有编译系统都体现出这一区别)。

    4. 在iostream中只对"<<“和”>>“运算符用于标准类型数据的输入输出进行了重载,但未对用户声明的类型数据的输入输出进行重载。如果用户声明了新的类型,并希望用”<<“和”>>"运算符对其进行输入输出,按照重运算符重载来做。

    • cerr流对象
      cerr流对象是标准错误流,cerr流已被指定为与显示器关联。cerr的 作用是向标准错误设备(standard error device)输出有关出错信息。cerr与标准输出流cout的作用和用法差不多。但有一点不同:cout流通常是传送到显示器输出,但也可以被重定向输出到磁盘文件,而cerr流中的信息只能在显示器输出。当调试程序时,往往不希望程序运行时的出错信息被送到其他文件,而要求在显示器上及时输出,这时应该用cerr。cerr流中的信息是用户根据需要指定的。

    • clog流对象
      clog流对象也是标准错误流,它是console log的缩写。它的作用和cerr相同,都是在终端显示器上显示出错信息。区别:cerr是不经过缓冲区,直接向显示器上输出有关信息,而clog中的信息存放在缓冲区中,缓冲区满后或遇endl时向显示器输出。

    • 缓冲区的概念:

    三. 标准输入流

    • 标准输入流对象cin,重点掌握的函数
    cin.get() //一次只能读取一个字符
    cin.get(一个参数) //读一个字符
    cin.get(两个参数) //可以读字符串
    cin.getline()// 允许读取包含空格的字符串。它将继续读取,直到它读取至最大指定的字符数,或直到按下了回车键。
    cin.ignore() //忽略缓冲区当前字符
    cin.peek() //偷窥下缓冲区的数据
    cin.putback() //将数据放回缓冲区
    
    //cin.get
    void test01()
    {
    #if 0
    	char ch = cin.get();
    	cout << ch << endl;
    	cin.get(ch);
    	cout << ch << endl;
    	//链式编程
    	char char1, char2, char3, char4;
    	cin.get(char1).get(char2).get(char3).get(char4);
    
    	cout << char1 << " " << char2 << "" << char3 <<  " " << char4 << " ";
    #endif
    
    	char buf[1024] = { 0 };
    	//cin.get(buf.1024);
    	cin.getline(buf,1024);
    	cout << buf;
    }
    
    //cin.ignore
    void test02()
    {
    	char buf[1024] = { 0 };
    	cin.ignore(2); //忽略缓冲区当前字符
    	cin.get(buf,1024);
    	cout << buf << endl;
    }
    
    //cin.putback 将数据放回缓冲区
    void test03()
    {
    	//从缓冲区取走一个字符
    	char ch = cin.get();
    	cout << "从缓冲区取走的字符:" << ch << endl;
    	//将数据再放回缓冲区
    	cin.putback(ch);
    	char buf[1024] = { 0 };
    	cin.get(buf,1024);
    	cout << buf << endl;
    }
    
    //cin.peek 偷窥
    void test04()
    {
    	//偷窥下缓冲区的数据
    	char ch = cin.peek();
    	cout << "偷窥缓冲区数据:" << ch << endl;
    	char buf[1024] = { 0 };
    	cin.get(buf, 1024);
    	cout << buf << endl;
    }
    
    void test05()
    {
    	cout << "请输入一个数字或者字符串:" << endl;
    	char ch = cin.peek();
    	if(ch >= '0' && ch <= '9')
    	{
    		int number;
    		cin >> number;
    		cout << "数字:" << number << endl;
    	}
    	else{
    		char buf[64] = { 0 };
    		cin.getline(buf, 64);
    		cout << "字符串:" <<  buf << endl;
    	}
    }
    

    四. 标准输出流

    1. 字符输出

    cout.flush() //刷新缓冲区 Linux下有效
    cout.put() //向缓冲区写字符
    cout.write() //从buffer中写num个字节到当前输出流中。
    
    //cout.flush 刷新缓冲区,linux下有效
    void test01()
    {	
    	cout << "hello world";
    	//刷新缓冲区
    	cout.flush(); 
    }
    
    //cout.put 输出一个字符
    void test02()
    {
    	cout.put('a');
    	//链式编程
    	cout.put('h').put('e').put('l');
    }
    
    //cout.write 输出字符串 buf,输出多少个
    void test03()
    {
    	//char* str = "hello world!";
    	//cout.write(str, strlen(str));
    	char* str = "*************";
    	for (int i = 1; i <= strlen(str); i ++)
    	{
    		cout.write(str, i);
    		cout << endl;
    	}
    
    	for (int i = strlen(str); i > 0; i --)
    	{
    		cout.write(str, i);
    		cout << endl;
    	}
    }
    

    2. 格式化输出

    • 在输出数据时,为简便起见,往往不指定输出的格式,由系统根据数据的类型采取默认的格式,但有时希望数据按指定的格式输出,如要求以十六进制或八进制形式输出一个整数,对输出的小数只保留两位小数等。有两种方法可以达到此目的。
    1. 使用控制符的方法;
    2. 使用流对象的有关成员函数。
    • 使用流对象的有关成员函数
      通过调用流对象cout中用于控制输出格式的成员函数来控制输出格式。用于控制输出格式的常用的成员函数如下:

      流成员函数setf和控制符setiosflags括号中的参数表示格式状态,它是通过格式标志来指定的。格式标志在类ios中被定义为枚举值。因此在引用这些格式标志时要在前面加上类名ios和域运算符“::”。格式标志见表:
    • 控制符格式化输出
      C++提供了在输入输出流中使用的控制符(有的书中称为操纵符)。
    //通过流成员函数
    void test01()
    {
    	int number = 99;
    	cout.width(20);
    	cout.fill('*');
    	cout.setf(ios::left);
    	cout.unsetf(ios::dec); //卸载十进制
    	cout.setf(ios::hex);
    	cout.setf(ios::showbase);
    	cout.unsetf(ios::hex);
    	cout.setf(ios::oct);
    	cout << number << endl;
    }
    //使用控制符
    void test02()
    {
    	int number = 99;
    	cout << setw(20)
    		<< setfill('~')
    		<< setiosflags(ios::showbase)
    		<< setiosflags(ios::left)
    		<< hex
    		<< number
    		<< endl;
    }
    
    • 对程序的几点说明
    1. 成员函数width(n)和控制符setw(n)只对其后的第一个输出项有效。如:
      cout. width(6);
      cout <<20 <<3.14<<endl;
      输出结果为 203.14
      在输出第一个输出项20时,域宽为6,因此在20前面有4个空格,在输出3.14时,width (6)已不起作用,此时按系统默认的域宽输出(按数据实际长度输出)。如果要求在输出数据时都按指定的同一域宽n输出,不能只调用一次width(n), 而必须在输出每一项前都调用一次width(n>,上面的程序中就是这样做的。

    2. 在表13.5中的输出格式状态分为5组,每一组中同时只能选用一种(例如dec、hex和oct中只能选一,它们是互相排斥的)。在用成员函数setf和 控制符setiosflags设置输出格式状态后,如果想改设置为同组的另一状态,应当调用成员函数unsetf(对应于成员函数self)或 resetiosflags(对应于控制符setiosflags),先终止原来设置的状态。然后再设置其他状态,大家可以从本程序中看到这点。程序在开 始虽然没有用成员函数self和控制符setiosflags设置用dec输出格式状态,但系统默认指定为dec,因此要改变为hex或oct,也应当先 用unsetf 函数终止原来设置。如果删去程序中的第7行和第10行,虽然在第8行和第11行中用成员函数setf设置了hex和oct格式,由于未终止dec格式,因 此hex和oct的设置均不起作用,系统依然以十进制形式输出。
      同理,程序倒数第8行的unsetf 函数的调用也是不可缺少的。

    3. 用setf 函数设置格式状态时,可以包含两个或多个格式标志,由于这些格式标志在ios类中被定义为枚举值,每一个格式标志以一个二进位代表,因此可以用位或运算符“|”组合多个格式标志。如倒数第5、第6行可以用下面一行代替:
      cout.setf(ios::internal I ios::showpos); //包含两个状态标志,用"|"组合

    4. 可以看到:对输出格式的控制,既可以用控制符(如例13.2),也可以用cout流的有关成员函数(如例13.3),二者的作用是相同的。控制符是在头文件iomanip中定义的,因此用控制符时,必须包含iomanip头文件。cout流的成员函数是在头文件iostream 中定义的,因此只需包含头文件iostream,不必包含iomanip。许多程序人员感到使用控制符方便简单,可以在一个cout输出语句中连续使用多种控制符。

    五. 文件读写

    1. 文件流类和文件流对象

    输入输出是以系统指定的标准设备(输入设备为键盘,输出设备为显示器)为对象的。在实际应用中,常以磁盘文件作为对象。即从磁盘文件读取数据,将数据输出到磁盘文件。

    和文件有关系的输入输出类主要在fstream.h这个头文件中被定义,在这个头文件中主要被定义了三个类,由这三个类控制对文件的各种输入输出操作,他们分别是ifstream、ofstream、fstream,其中fstream类是由iostream类派生而来,他们之间的继承关系见下图所示:

    由于文件设备并不像显示器屏幕与键盘那样是标准默认设备,所以它在fstream头文件中是没有像cout那样预先定义的全局对象,所以我们必须自己定义一个该类的对象。ifstream类,它是从istream类派生的,用来支持从磁盘文件的输入。ofstream类,它是从ostream类派生的,用来支持向磁盘文件的输出。

    fstream类,它是从iostream类派生的,用来支持对磁盘文件的输入输出。

    2. C++打开文件

    所谓打开(open)文件是一种形象的说法,如同打开房门就可以进入房间活动一样。 打开文件是指在文件读写之前做必要的准备工作,包括:

    1. 为文件流对象和指定的磁盘文件建立关联,以便使文件流流向指定的磁盘文件。
    2. 指定文件的工作方式,如:该文件是作为输入文件还是输出文件,是ASCII文件还是二进制文件等。
    • 以上工作可以通过两种不同的方法实现:
    1. 调用文件流的成员函数open。如
      ofstream outfile; //定义ofstream类(输出文件流类)对象outfile
      outfile.open(“f1.dat”,ios::out); //使文件流与f1.dat文件建立关联
      第2行是调用输出文件流的成员函数open打开磁盘文件f1.dat,并指定它为输出文件, 文件流对象outfile将向磁盘文件f1.dat输出数据。ios::out是I/O模式的一种,表示 以输出方式打开一个文件。或者简单地说,此时f1.dat是一个输出文件,接收从内存 输出的数据。
      磁盘文件名可以包括路径,如"c:\new\f1.dat",如缺省路径,则默认为当前目录下的文件。

    2. 在定义文件流对象时指定参数
      在声明文件流类时定义了带参数的构造函数,其中包含了打开磁盘文件的功能。因此, 可以在定义文件流对象时指定参数,调用文件流类的构造函数来实现打开文件的功能。

    • 几点说明:
    1. 新版本的I/O类库中不提供ios::nocreate和ios::noreplace。

    2. 每一个打开的文件都有一个文件指针,该指针的初始位置由I/O方式指定,每次读写都从文件指针的当前位置开始。每读入一个字节,指针就后移一个字节。当文件指针移到最后,就会遇到文件结束EOF(文件结束符也占一个字节,其值为-1),此时流对象的成员函数eof的值为非0值(一般设为1),表示文件结束 了。

    3. 可以用“位或”运算符“|”对输入输出方式进行组合,如表13.6中最后3行所示那样。还可以举出下面一些例子:
      ios::in | ios:: noreplace //打开一个输入文件,若文件不存在则返回打开失败的信息
      ios::app | ios::nocreate //打开一个输出文件,在文件尾接着写数据,若文件不存在,则返回打开失败的信息
      ios::out l ios::noreplace //打开一个新文件作为输出文件,如果文件已存在则返回打开失败的信息
      ios::in l ios::out I ios::binary //打开一个二进制文件,可读可写
      但不能组合互相排斥的方式,如 ios::nocreate l ios::noreplace。

    4. 如果打开操作失败,open函数的返回值为0(假),如果是用调用构造函数的方式打开文件的,则流对象的值为0。可以据此测试打开是否成功。如
      if(outfile.open(“f1.bat”, ios::app) ==0)
      cout <<“open error”;

      if( !outfile.open(“f1.bat”, ios::app) )
      cout <<“open error”;

    3. C++关闭文件

    在对已打开的磁盘文件的读写操作完成后,应关闭该文件。关闭文件用成员函数close。如:outfile.close( ); //将输出文件流所关联的磁盘文件关闭

    所谓关闭,实际上是解除该磁盘文件与文件流的关联,原来设置的工作方式也失效,这样,就不能再通过文件流对该文件进行输入或输出。此时可以将文件流与其他磁盘文件建立关联,通过文件流对新的文件进行输入或输出。如:

    outfile.open(“f2.dat”,ios::app|ios::nocreate);
    此时文件流outfile与f2.dat建立关联,并指定了f2.dat的工作方式。

    4. C++对ASCII文件的读写操作

    如果文件的每一个字节中均以ASCII代码形式存放数据,即一个字节存放一个字符,这个文件就是ASCII文件(或称字符文件)。程序可以从ASCII文件中读入若干个字符,也可以向它输出一些字符。

    1. 用流插入运算符“<<”和流提取运算符“>>”输入输出标准类型的数据。“<<”和“ >>”都巳在iostream中被重载为能用于ostream和istream类对象的标准类型的输入输出。由于ifstream和 ofstream分别是ostream和istream类的派生类;因此它们从ostream和istream类继承了公用的重载函数,所以在对磁盘文件的操作中,可以通过文件流对象和流插入运算符“<<”及 流提取运算符“>>”实现对磁盘 文件的读写,如同用cin、cout和<<、>>对标准设备进行读写一样。

    2. 用文件流的put、get、geiline等成员函数进行字符的输入输出,:用C++流成员函数put输出单个字符、C++ get()函数读入一个字符和C++ getline()函数读入一行字符。

    int main()
    {
    	char* sourceFileName = "./source.txt";
    	char* targetFileName = "./target.txt";
    	//创建文件输入流对象
    	ifstream ism(sourceFileName, ios::in);
    	//创建文件输出流对象
    	ofstream osm(targetFileName,ios::out);
    
    	if (!ism)
    	{
    		cout << "文件打开失败!" << endl;
    	}
    
    	while (!ism.eof())
    	{
    		char buf[1024] = { 0 };
    		ism.getline(buf,1024);
    		cout << buf << endl;
    		osm << buf << endl;
    	}
    	//关闭文件流对象
    	ism.close();
    	osm.close();
    	return 0;
    }
    

    5. C++对二进制文件的读写操作

    二进制文件不是以ASCII代码存放数据的,它将内存中数据存储形式不加转换地传送到磁盘文件,因此它又称为内存数据的映像文件。因为文件中的信息不是字符数据,而是字节中的二进制形式的信息,因此它又称为字节文件。
    对二进制文件的操作也需要先打开文件,用完后要关闭文件。在打开时要用ios::binary指定为以二进制形式传送和存储。二进制文件除了可以作为输入文件或输出文件外,还可以是既能输入又能输出的文件。这是和ASCII文件不同的地方。

    • 用成员函数read和write读写二进制文件
      对二进制文件的读写主要用istream类的成员函数read和write来实现。这两个成员函数的原型为
      istream& read(char *buffer,int len);
      ostream& write(const char * buffer,int len);

      字符指针buffer指向内存中一段存储空间。len是读写的字节数。调用的方式为:
      a. write(p1,50);
      b. read(p2,30);

      上面第一行中的a是输出文件流对象,write函数将字符指针p1所给出的地址开始的50个字节的内容不加转换地写到磁盘文件中。在第二行中,b是输入文件流对象,read 函数从b所关联的磁盘文件中,读入30个字节(或遇EOF结束),存放在字符指针p2所指的一段空间内。

    class Person
    {
    public:
    	Person(char* name,int age)
    	{
    		strcpy(this->mName, name);
    		this->mAge = age;
    	}
    public:
    	char mName[64];
    	int mAge;
    };
    
    int main()
    {
    	char* fileName = "person.txt";
    	//二进制模式读写文件
    	//创建文件对象输出流
    	ofstream osm(fileName, ios::out | ios::binary);
    
    	Person p1("John",33);
    	Person p2("Edward", 34);
    
    	//Person对象写入文件
    	osm.write((const char*)&p1,sizeof(Person));
    	osm.write((const char*)&p2, sizeof(Person));
    
    	//关闭文件输出流
    	osm.close();
    
    	//从文件中读取对象数组
    	ifstream ism(fileName, ios::in | ios::binary);
    	if (!ism)
    	{
    		cout << "打开失败!" << endl;
    	}
    	
    	Person p3;
    	Person p4;
    
    	ism.read((char*)&p3, sizeof(Person));
    	ism.read((char*)&p4, sizeof(Person));
    
    	cout << "Name:" << p3.mName << " Age:" << p3.mAge << endl;
    	cout << "Age:" << p4.mName << " Age:" << p4.mAge << endl;
    
    	//关闭文件输入流
    	ism.close();
    	return 0;
    }
    
    展开全文
  • Python的输入输出用法

    千次阅读 2018-08-04 17:30:39
    1.输出print()的相关用法 注意:print ()默认输出是换行的,如果想实现不换行则需要在变量末尾加上end=""即可。 python@ubuntu:~$ python3 Python 3.5.2 (default, Nov 23 2017, 16:37:01) [GCC 5.4.0 20160609]...

    1.输出print()的相关用法

    注意:print ()默认输出是换行的,如果想实现不换行则需要在变量末尾加上 end=""即可。

    python@ubuntu:~$ python3
    Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
    [GCC 5.4.0 20160609] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> name ="tom"
    #python中用%取变量的值,又因为name是字符串类型,所以用%s填充
    >>> print("my name is %s"%name)  
    my name is tom
    >>> age = 21
    #同时取多个变量的值用%(a,b,c)的形式。
    >>> print("my name is %s,%d years old"%(name,age))
    my name is tom,21 years old
    
    
    #注意:不换行和一行写多个语句的用法。
    >>> print("a");print("b") #一行写多个语句用;分割
    a
    b
    >>> print("a",end="");print("b") #不换行
    ab
    >>>
    格式符号 转换
    %c 字符
    %s 通过str() 字符串转换来格式化
    %i 有符号十进制整数
    %d 有符号十进制整数
    %u 无符号十进制整数
    %o 八进制整数
    %x 十六进制整数(小写字母)
    %X 十六进制整数(大写字母)
    %e 索引符号(小写'e')
    %E 索引符号(大写“E”)
    %f 浮点实数
    %g %f和%e 的简写
    %G %f和%E的简写

    2.input()用法 

    对于python3来说,只有一种输入用法,input(string s),括号里字符串用来提示作用。
    input()函数默认将所有的输入内容当成字符串来处理。
    >>> v1 = input("这是用来输入提示用的:")
    这是用来输入提示用的:1+5
    >>> print(v1)
    1+5
    >>> v2 = input("enter a number:")
    enter a number:5
    >>> print(v2+3)   
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: Can't convert 'int' object to str implicitly
    >>> print(int(v2)+2)  #使用类型转换符int(),将字符串v2转换成int,然后加减
    7
    >>> 
    #对于python2,来说,input(),则是将输入的内容当成表达式处理(表达式会运算以后再赋值)
    >>> v1 = input("python2的测试:")
    pthon2的测试:1+4
    >>> print(v1)
    5
    #当然python2中有一个raw_input()等同于python中的input(),python3中已经没有了raw_input(),只有改进版本的input().

    统一声明:关于原创博客内容,可能会有部分内容参考自互联网,如有原创链接会声明引用;如找不到原创链接,在此声明如有侵权请联系删除哈。关于转载博客,如有原创链接会声明;如找不到原创链接,在此声明如有侵权请联系删除哈。

    展开全文
  • Android输入输出安全浅析

    千次阅读 2015-01-12 12:17:34
    任何一款独立的操作系统都离不开输入输出环节,并且输入输出的安全与否关于到使用这个操作系统的用户隐私安全,Android系统也不例外,而且用户对手机的使用频率远远大于PC,这使得它的输入输出安全越发重要。...

    转自CSDN《程序员杂志》 作者:火点,Orlando

    任何一款独立的操作系统都离不开输入输出环节,并且输入输出的安全与否关于到使用这个操作系统的用户隐私安全,Android系统也不例外,而且用户对手机的使用频率远远大于PC,这使得它的输入输出安全越发重要。本文抛砖引玉,对Android输入输出系统安全深入浅出的分析。

    输入输出子系统的重任

    简单的说,用户与手机的所有交互都是输入输出子系统承载的,用户通过各种输入设备向系统传达指令,如触摸屏,物理按键,各种sensor等等,然后结果输入子系统传递到某个具体应用完成用户想要的操作,然后通过输出子系统呈现给用户结果。由此可见,如果输入输入被攻破,用户的隐私数据将被轻松窃取,造成极大损失,如输入的银行卡号,密码,身份信息,隐私聊天记录,照片,视频等等,都有可能被窃取。那时,手机真的就变成手雷了。

    那么,Android输入输出子系统到底安全吗?且看下面的分析。

    输入子系统的漫漫长路

    Android输入子系统工作内容主要包括以下几点:

    1.      InputReader线程从按键,触摸屏等输入设备获取原始输入信息

    开机后,Android中最重要的系统进程system_server中的InputManagerService在初始化中会创建两个线程用来处理输入事件,一个是InputReaderThread,一个是InputDispatcherThread。InputReaderThread在死循环中一直从EventHub中读取系统的输入事件,然后发送到InputDispatcher类中的一个队列里,用于InputDispatcher对其进行分发。

    2.      InputDispatcher线程处理InputDispatcher队列中的事件。

    在InputReaderThread使用了epoll机制,当有新的输入事件线程被唤醒,把转换好的消息发送到相应的窗口去,通过InputChannel把事件发送给具体的app进程。

    3.      App进程收到事件后,最终通过一个view tree结构的根Décor View分发到最终会处理这个事件的Child View。

    图1.输入子系统

    上面涉及到2个进程通信,如果牵扯到输入法,就更复杂了,涉及到三方通信。如图2所示,输入法进程(以下简称IME,InputMethod),软键盘对于输入子系统来说就是touch事件,所有touch事件通过输入子系统到了IME进程,根据touch坐标转换成为真正的输入字符,然后IME利用InputConnection(实际上是对IInputContext Binder的封装)通过IPC将输入的字符串传给正在接受输入的app进程的某个TextView显示出来,传输的字符串都是明文啊!

    图2.输入法通信模型

    从上面的分析我们可以看到,输入的漫漫长路,任何一个环节都有可能被攻击,这里举几个例子。

    0x01追根溯源

    直接监听分析输入设备原始事件,在/dev/input/目录下的节点权限如下。

    图3.Input设备节点

    而通过adb登陆的shell因为调试需要,也加入了input这个group (如图4所示,可参考android系统源码文件adb.c),并且android内置了getevent事件工具,就目前经验,很少有厂商会从量产版本中去掉这个工具,所以可以非常轻松的通过adb shell拿到用户输入,整理如下,输入的坐标位置一目了然,如果再能结合其他信息,如使用哪个输入法,屏幕分辨率等,就可以计算出输入了哪些字符。也就是说一旦我们电脑中了病毒,而碰巧又是连接电脑在输入敏感信息,嘿嘿,那恶意程序就可以把所有的输入通通拿到,一览无余!


    图4  adb shell调试权限如此之多


    图5 通过getevent工具分析输入事件

    0x02直击要害

    前面的不过瘾,数据不直观,更高级的恶意程序可能已经获得了root权限,这样还不如直击要害,从前文分析中,在输入法通信模型中,直接注入截获InputConnection的commitText,就能轻松拿到输入字符,省事多了,如果你注入的是输入法IME进程,那些敏感app(如支付,金融,通讯类)的开发者可是要哭死了,因为它无法监控IME是否被入侵,只能心中无奈OS,“臣妾做不到啊!”。

    0x03另类奇葩

    很久之前听说一种名叫TapLogger的病毒,它可以通过动作传感器获取你的输入信息。也就是说即便是触摸屏幕的虚拟键盘,它也能搞清楚你到底在输入什么。据说4位数密码能够达到100%的正确率,6位能够达到80%的正确率。

     

    输出子系统的如此简单

    如果说输入子系统因为流程复杂导致安全风险,那么输出子系统则因为简单,从而导致攻击难度降低。

    Android输出子系统主要是经典的Composite模式,如下图


    图6 输出子系统

    每个App都会传递自己的surface到SurfaceFlinger,SurfaceFlinger做一次composite形成一个显示的buffer传给FrameBuffer,再不考虑Overlay buffer的特殊情况下,LCD直接扫描FrameBuffer显示在屏幕上。

    问题就出在这个FrameBuffer上,在系统中最终会放到/dev/graphics/fb0节点,如果这个节点不小心被很二的工程师配置成others可以读写,恶意程序就可以轻松通过读取FrameBuffer内容达到截屏的效果,而且Android为了系统截屏方便,还自带screenshot工具对FrameBuffer做了封装,用起来非常方便。我们就在国内某著名厂商的旗舰机中发现了类似问题,如图7所示,网上流行的号称非root截屏的app其实就是利用这个漏洞实现的。


    图7 有安全漏洞的fb0节点

    即便是没有这个漏洞,others没有任何权限(如图8所示),但是通过adb登陆的shell因为调试需要,也加入了graphics group(这一点在上面图4中代码中也可以看出来),也就是说一旦我们电脑中了病毒,而碰巧又是连接电脑在输入敏感信息,嘿嘿,各种敏感输入,各种猥琐聊天轻松被截屏。又是因为调试,看来安全和调试果然是冤家,个人认为,安全更重要,显然Google在此时倾向于调试功能的丰富。


    图8  无安全漏洞的fb0节点

    展望

    近年来,芯片厂商,手机厂商,ROM开发者,甚至应用开发者对Android的深入定制都有可能引入新的安全漏洞。好的一面是Google已经越来越重视Android系统安全,随着版本不断升级,安全性也在不断提高,新发布的5.0使得手机root越来越困难,同时有实力的芯片厂商,手机厂商也在研发自己的安全解决方案,尤其是在移动支付领域,将安全带入新的高度。移动系统安全任重而道远。

     

    展开全文
  • GPIO通用输入输出

    千次阅读 2020-05-06 17:20:27
    用途:GPIO是通用输入输出(General Purpose I/O)的简称,主要用于工业现场需要用到数字量输入/输出的场合。 例如: 输出功能:继电器、LED、蜂鸣器 输入功能:传感器状态、高低电平等信息的读取 复用功能:片内外...

    GPIO通用输入输出

    一、GPIO的功能概述

    • 用途:GPIO是通用输入输出(General Purpose I/O)的简称,主要用于工业现场需要用到数字量输入/输出的场合。

    • 例如:

      输出功能:继电器、LED、蜂鸣器

      输入功能:传感器状态、高低电平等信息的读取

      复用功能:片内外设对外的接口

      时序模拟:模拟SPI、I2C和UART等常用接口的时序

    • 基本特性

      1. 多种工作工作模式:输入、输出、复用、模拟
      2. 灵活的复用功能
      3. 5V的电压容限(除ADC的其他都是)
      4. 外部中断功能
    • 两个基本概念(端口和引脚)

      • 端口(PORT)
      1. 独立的外设子模块,包含多个引脚,通过多个硬件寄存器控制引脚

      2. GPIO模块由端口GPIOA、GPIOB、GPIOC等多个独立的子模块构成

      3. 例如:端口GPIOA包含了PA0~PA15这16个引脚,通过10个硬件寄存器控制引脚工作

      • 引脚(PIN)
      1. 对应微控制器的一个管脚,归属于端口,由端口寄存器的对应为控制
      2. PA0对应STM32的某一脚,属于端口GPIOA,输出电平由端口GPIOA的输出数据寄存器GPIO_ODR的第0位决定。

    总结: 一个端口默认包含16个引脚,但不同型号的STM32微控制器所包含的端口数量及各端口包含的引脚数量各不相同,具体信息可以查询芯片的数据手册。

    二、GPIO模块的电路结构

    • 电路结构
      在这里插入图片描述
    • 工作模式分类
      在这里插入图片描述

    三种输入模式:浮空输入、上拉输入、下拉输入

    在这里插入图片描述

    两种输出模式:开漏输出模式和推挽输出

    在这里插入图片描述

    1. 推完输出

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FuxBDrXH-1588755676637)(C:\Users\zhf28\Desktop\STM32Cubemax学习笔记\GPIO\img\9.png)]

    1. 开漏输出

    在这里插入图片描述

    1. 模拟模式

    在这里插入图片描述
    在这里插入图片描述

    1. 复用模式

    在这里插入图片描述

    三、GPIO模块的寄存器介绍

    • 端口寄存器

    在这里插入图片描述

    1. 模式寄存器(GPIOx_MODER)

    在这里插入图片描述

    1. 输出类型寄存器(GPIOx_OTYPER)

    在这里插入图片描述

    1. 输出速度寄存器(GPIOx_OSPEEDR)

    在这里插入图片描述

    1. 上/下拉寄存器(GPIOx_PUPDR)

    在这里插入图片描述

    1. 输入数据寄存器(GPIOx_IDR)

    在这里插入图片描述

    1. 输出数据寄存器(GPIOx_ODR)

    在这里插入图片描述

    1. 置位/复位寄存器(GPIOx_BSSRR)

    在这里插入图片描述

    四、指针访问寄存器

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    五、利用结构体指针访问寄存器组

    • 多个寄存器的定义(结构体)
    struct GPIO
    {
        volatile unsigned int MODER
        ···
    }
    

    volatile (__IO):防止编译器优化

    unsigned int(uint32_t)数据类型

    typedefl类型定义

    UL:指无符号长整型

    • 为了方便于用户使用,ST公司将STM32微控制器片内说有外设寄存器都采用结构体定义,以.h文件的形式提供给用户;
    • 用户在使用时,只需要包含该头文件,就可以通过外设的结构体指针访问外设相关寄存器;
    • 不同型号微控制器的头文件各不相同。以STM32F411系列微控制器为例,对应的.h文件为stm32f411xe.h;

    六、GPIO外设的数据类型

    • 分为三个

    在这里插入图片描述

    1. 引脚初始化数据类型

    在这里插入图片描述

    • Pin的取值范围

    在这里插入图片描述

    • 成员变量Mode的取值范围
    • 成员变量Pull的取值范围
    • 成员变量Speed的取值范围
    • 成员变量Alternate的取值范围
    1. 引脚电平状态数据类型(枚举类型)
    typedef enum
    {
        GPIO_PIN_RESET = 0,		//引脚低电平状态
        GPIO_PIN_SET			//引脚高电平状态
    }GPIO_PinState;
    
    1. 端口数据类型:指向端口寄存器组的结构体指针
    • GPIOA、GPIOB、GPIOC、GPIOD···
    • 不同STM32,端口数量不同
    • 端口数据类型的定义是在以芯片型号命名的.h文件中。

    七、GPIO外设接口函数

    • 分类

    在这里插入图片描述

    1. 引脚初始化函数:HAL_GPIO_Init

    在这里插入图片描述

    1. 引脚复位函数:HAL_GPIO_Delnit

    在这里插入图片描述

    1. 读取引脚函数:HAL_GPIO_ReadPin

    在这里插入图片描述
    在这里插入图片描述

    1. 写入引脚函数:HAL_GPIO_WritePin

    请添加图片描述
    在这里插入图片描述

    1. 翻转引脚函数:HAL_GPIO_TogglePin

    在这里插入图片描述在这里插入图片描述

    1. 锁定引脚函数:HAL_GPIO_LockPin

    在这里插入图片描述

    展开全文
  • C++的输入输出与标准输出

    万次阅读 2016-09-20 11:23:35
    一、 C++ 输入输出的含义  以前所用到的输入和输出,都是以终端为对象的,即从键盘输入数据,运行结果输出到显示器屏幕上。从操作系统的角度看,每一个与主机相连的输入输出设备都被看作一个文件。程序的输入指的...
  • 目录 目录 前言 IO流的概念和流类库的...在学习了C++输入输出流后,未知的更,但是有了整体的一个概念! 学习!分享!感谢! I/O流的概念和流类库的结构 程序的输入指的是从输入文件将数据传送给程序,程
  • 大小写字母转换(大-小)(小-大) 其它:超简单输入输出putchar( 32+getchar() );
  • C++输入输出

    千次阅读 2016-05-08 22:24:03
    9.1 I/O流的概念和流类库的结构 程序的输入指的是从输入文件将数据...这种输入输出称为标准的输入输出简称标准I/O。  以外存磁盘文件为对象进行输入和输出,即从磁盘文件输入数据,数据输出到磁盘文件。以外存文件
  • 标准输入输出

    2012-06-17 18:25:51
    通常,所谓的标准输入指的是键盘,标准输出指的是屏幕。我们已经知道了如何通过 print 函数来打印消息到标准输出,事实上,那是简写,完整的写法如下: #!/usr/bin/perl # 标准输出 print "message\n"; print ...
  • C++标准输入/输出

    千次阅读 2018-04-17 19:48:40
    从操作系统的角度看,每一个与主机相连的输入输出设备都被看作一个文件。程序的输入指的是从输入文件将数据传送给程序,程序的输出指的是从程序将数据传送给输出文件。C++的输入与输出包括以下3方面的内容: 1、对...
  • C++输入输出

    千次阅读 2016-07-14 14:27:46
    C++输入输出流 一、C++ 输入输出的含义 在C语言中我们就已经了解过输出输出的概念,即从键盘输入数据,运行结果输出到显示器屏幕上。站在操作系统的角度看,每一个与主机相连的输入输出设备都被看作一个文件。...
  • Python 输入输出

    千次阅读 2013-03-15 16:39:32
    在很时候,你会想要让你的程序与用户(可能是你自己)交互。你会从用户那里得到输入,然后打印一些结果。我们可以分别使用raw_input...另一个常用的输入/输出类型是处理文件。创建、读和写文件的能力是许多程序所必需
  • 输入输出阻抗

    千次阅读 2013-07-21 19:21:39
    在同样的输入电压的情况下,如果输入阻抗很低,就需要流过较大电流,这就要考验前级的电流输出能力了;而如果输入阻抗很高,那么只需要很小的电流,这就为前级的电流输出能力减少了很大负担。所以电路设计中尽量提高...
  • C语言-格式化输入输出

    千次阅读 2019-10-28 11:46:28
    它的作用是将输出的数据转换为指定的格式输出。格式说明总是由“%”字符开始的。不同类型的数据用不同的格式字符。 格式字符有d,o,x,u,c,s,f,e,g等 如: %d整型输出,%ld长整型输出, %o以八进制数形式输出...
  • MSP432输入输出模块

    千次阅读 2019-06-30 19:47:10
    第6章MsP432微控制器输入输出模块 单片机中的输入输出模块是供信号输入、输出所用的模块化单元。MsP432单片机的片内输入输出模块非常丰富,典型的输入输出模块有:通用O端口、模/数转换模块、比较器E  定时器。...
  • C++学习笔记——输入输出

    千次阅读 2015-08-16 12:46:08
    这种输入输出称为标准的输入输出简称标准I/O。 以外存磁盘文件为对象进行输入和输出,即从磁盘文件输入数据,数据输出到磁盘文件。以外存文件为对象的输入输出称为文件的输入输出简称文件I/O。 对内存中指定的...
  • long型输入输出

    千次阅读 2020-08-14 10:06:22
    title: long型输入输出 date: 2020-01-13 09:32:58 tags: 蓝桥杯 long型存储大小为4个字节,存储值的范围为-2,147,483,648 到 2,147,483,647。long a是long int a的简写,完全一样。%ld和%d在一般的32位环境中也是...
  • perl输入输出

    万次阅读 2012-09-21 13:54:32
    1.从标准输入设备输入 为行输入操作,但其实际上是对一个文件句柄(filehandle)的行输入操作(有 $line = ; #读入下一行; chomp($line); #去掉结尾的换行符 chomp($line=) #同上,更常用的方法 由于,行输入操作...
  • Python学习笔记(二)—输入输出

    千次阅读 2017-10-12 17:40:36
    转载请注明出处:http://www.jianshu.com/p/36a6e0ec9d2f 本文出自Shawpoo的简书 我的博客:CSDN博客 ...Python和大部分编程语言一样,都有读写数据的API,也就是输入输出函数。输入是Input,输出是Output,所
  • C++的标准输入输出

    千次阅读 2018-01-18 21:54:11
    转载自:...从操作系统的角度看,每一个与主机相连的输入输出设备都被看作一个文件。程序的输入指的是从输入文件将数据传送给程序,程序的输出指的是从程序将数据传送给输出文件
  • C++中的标准输入输出

    千次阅读 2017-01-03 15:49:05
    在C++中的我们的输入输出都是以终端为对象的,即从键盘输入数据,运行结果输出到显示器屏幕上。从操作系统(Linux)的角度看,每一个与主机相连的输入输出设备都被看作一个文件。程序的输入指的是从输入文件将数据传送...
  • 输入阻抗与输出阻抗

    千次阅读 2017-03-24 10:48:00
    什么是阻抗?  在具有电阻、电感和电容的电路里,对交流电所起的阻碍作用叫做阻抗。阻抗常用Z表示。阻抗由电阻、感抗和容抗三者组成,但不是三者简单相加。阻抗的单位是欧。在直流电中,物体对电流阻碍的...
  • 一、 输入表 1、输入表地址定位  PE文件头可选映像头中数据目录表的第二成员指向输入表,输入表以一个 IAMGE_IMPORT_DESCRITPTOR 数组开始,每个被PE文件隐式地链接进来的DLL都有一个IID,在这个数组中没有字段...
  • c++中输入输出流详解

    千次阅读 多人点赞 2014-09-04 11:33:57
    一、 C++ 输入输出的含义以前所用到的输入和输出,都是以终端为对象的,即从键盘输入数据,运行结果输出到显示器屏幕上。从操作系统(Linux)的角度看,每一个与主机相连的输入输出设备都被看作一个文件。程序的输入...
  • 操作系统第六章输入输出系统

    千次阅读 2018-07-05 21:30:46
    第六章:输入输出系统 I/O系统的功能,模型和接口 I/O系统管理的对象是I/O设备和相应的设备控制器。 I/O系统的基本功能 隐藏物理设备的细节 与设备的无关性 提高处理机和I/O设备的利用率 对I/O设备进行...
  • stm32的定时器输入捕获与输出比较

    万次阅读 多人点赞 2017-08-27 09:46:16
    对比AD的构造,stm32有3个AD,每个AD有很通道,使用哪个通道就配置成哪个通道,这里定时器也如此,有很定时器TIMx,每个定时器有很CHx(通道),可以配置为输入捕捉-------测量频率用,也可以配置为输出比较------...
  • 第五章 微型计算机输入输出接口

    千次阅读 2012-11-17 20:16:54
    5.1 输入输出接口 5.1.1 外部设备及其信号 外部设备的分类 按照数据传输方向分:  1、输入设备;2、输出设备;3、复合输入输出设备 按照设备的功效:  1、人机交互设备;2、数据存储设备;3、媒体输入输出...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 167,954
精华内容 67,181
关键字:

多输入多输出是什么的简称