c语言和c++在终端I/O处理的异同

问题:对一个整型数组求和
要求:定义一个存储着n个元素的数组要求用C语言完成这个任务

  • 用c语言来写
 #include <stdio.h>
 int addarray( int array[], int n ) ;
 int main() 
 {
  int data[]={0,1,2,3,4,5,6,7,8,9};
  int size = sizeof(data)/ sizeof(data[ 0]);
  printf("data: %d\n", sizeof (data));
  printf("结果是:d\n", addarray(data,size)); 
  return 0; 
 }
 int addarray( int array[], int n  )
{
   int sum=0;
   int i ;
   printf("array: %d\n", sizeof(array));     
   for( i=0;i< n;i++) 
   {sum += array[i];}
   return sum;
  }     
//data:40
//结果是:45
//array:4

用指针来实现

   #include <stdio.h>
 int addarray( int *array, int n ) ; 
 int main() 
  {  int data[]={0,1,2,3,4,5,6,7,8,9};  
  int size = sizeof(data)/ sizeof(data[ 0]);  
  printf("data: %d\n", sizeof (data));
    printf("结果是:d\n", addarray(data,size));   return 0;  } 
  int addarray( int *array, int n  )
  {   int sum=0;  
   int i ;   
   printf("array: %d\n", sizeof(array));        
   for( i=0;i< n;i++)   
    {sum += array[i];}   
    return sum;  }     

  

以上两个程序从本质上来说是相同的,我们得出结论:将函数的参数声明为数组和声明为指针是一样的。

  • 现在我们来考虑一个新的问题:将该程序用C++来实现试试
  #include <iostream>  //c99
     using namespace std;
      int addarray( int *array, int n ) 
int main() 
  {  int data[]={0,1,2,3,4,5,6,7,8,9};   
   int size = sizeof(data)/ sizeof(data[ 0]);  
     cout<<"结果是:"<<addarray(data,size)<<endl; 
   return 0;  }  
 int addarray( int *array, int n  )  
 {   int sum=0; 
     int i ;   
     for( i=0;i< n;i++)     
      {sum += array[i];}      
      return sum;  }     

   #include <iostream.h>// c92
    //using namespace std;

这个小程序展示了C对象的第一次使用。对象在哪里?就是这个”cout“。
cout是一个输出流对象,它是” console out(控制台输出)“的缩写。是属于basic_ostream类的对象。 ostream类在iostream头文件中定义。
什么是输出流?其实也就是一个概念,在C++中引入了很多类似的概念:例如数据可以从键盘流入程序,又可以从程序流向屏幕、打印机等。
注意到“<<”这个符号,这个操作符不是C语言里位运算的左移操作符吗?难道在C++里边改规则了?
事实上不是这样的,它只不过体现了C+的另一个特点:支持重载。重载事实上就是允许我们按照不同的方式使用同一个操作符。

要求:编写一个程序,要求用户输入一串整数和任意数目的空格,这些整数必项位于同行中,但允许出现在该行中的任何位置当用户按下键盘上的“ Enter”键时,数据输入结束。程序自动对所有的整数进行求和并打印出结果。

   #include <stdio. h> 
  #include <stdlib. h>
    void main( )
    {   
        int i ;
        int sum=0;
        char ch  ;
         printf("请输入一串整数和任意数目的空格:"); 
         while( scanf("%d",&i) == 1 )
          sum += i;
          whiler((ch= getchar())== ' ') //屏蔽空格   
                ;
          if( ch   ==' \n')
              break; 
          ungetc( ch, stdin ); //将变量ch中存放的字符退回给stdin输入流
     }
      printf("结果是:%d",5um);
       printf( "\n"    );
       system(" pause ");     
}
  #include <iostream> 
  using namespace std;
  int main( )
  {
    int sum=0;
      cout<<"请输入一串整数和任意数目的空格: "  ;
      int i;
      while( cin >>i)   
      {
            sum += i;
            while( cin.peek()  == ' ')
            {   cin.get();    }
            if( cin.peek()=='\n ')
            {break;}  
        }
        cout《"结果是:"《sum<<endl; 
        return 0;
     }     
     

这个程序使用了流对象cin。这个对象的类型是 istream,它知道如何从用户终端读取数据。
cin》i; cin输入操作符又称为提取操作符,它一次从输入流对象cin提取一个整数。
当用户进行键盘输入时,对应的字符将输入到操作系统的键盘缓冲区中。
这样,当用户点击键盘上的“ Enter”键时操作系统把键盘缓冲区的内容传输到cin流的内部缓冲区,“》”操作符随后从这个缓冲区提取需要的信息。
我们还发觉,如果用户不进行键盘的输入,程序将会阻塞。这是阻塞性( blocking)IO的例子。
" 》”最初定义为右移操作符,它在C++中进行了重载,当它按照这里所示的方式使用时它就用于从输入流对象提取信息。
另外,这个操作符对所有内建的数据类型都进行了重载,所以它可以从输入流对象提取出int,float, double型数据,也可以提取字符串等数据 。

在 while(cin>>i)中,麦达式cin》i返回输入流对象本身,也就是cin。但是,如果到还了文件尾或者提取操作符遇到一个非法值,这个源回值将是 false

  • cin是
    istream类的对象,那么cin同样具有一些方法,这些方法可以增强对于输入操作的控制,下边我们将通过简单的例子介绍cin的一些方法!

例子一:cin. .ignore()&cin. getline()
例子二:cin.get()&cin.peek( )
例子三:cin. gcount()&cin.read ()

  #include <iostream> 
  using namespace std; 
   int main( )  
   {
    char buf[20];
    cin.ignore(7);
    cin.getline( buf,10);
    cout <<buf <<endl;
    return 0;     
   }
//结果
// I love Fishc. com!
// Fishc.com 
// Press any key to continue
  #include <iostream> 
  using namespace std;  
    int main( )   
      { 
         char p;
          cout《"请输入一段文本:\n "
          while( cin.peek()!='\n ')
          {
          p= cin.get();
          cout <<p;
          }  
          cout < endl ;
          return   0;
        }
        
  //        输出结果
// I love Fishc. com!
// Fishc.com  Press any key to continue
 
  #include <iostream> 
   using namespace std; 
     int main(   )
     {
      const int SIZE=50;
      char buf[SIZE];
       cout《"请输入一段文本:"; 
       cin.read( buf, 20)  ;  
       cout《“字符串收集到的字符数为:" <<cin.gcount()<<endl;    
       cout《"输入的文本信息是:";
       cout. write( buf, 20 ) ;
       cout < endl ;
       return 0;     
       
   //输入: I love fishc.com!!!!!!!!!
  // 字符串收集到的字符数:20
  // 的文本信息 : I love fish. com!!!!      

   

下边再介绍几种关于cout对象的方法。同样我们通过实例在让大家快速认识!
实例一:cout. precision()
实例二: cout width()

 一、ASCII 输出   为了使用下面的方法, 你必须包含头文件(译者注:在标准C++中,已经使用取 代,所有的C++标准头文件都是无后缀的。)。这是 的一个扩展集, 提供有缓 冲的文件输入输出操作. 事实上, 已经被包含了, 所以你不必包含所有这两个 文件, 如果你想显式包含他们,那随便你。我们从文件操作类的设计开始, 我会讲解如何进行ASCII I/O 操作。如果你猜是"fstream," 恭喜你答对了! 但这篇文章介绍的方法,我们分别使用"ifstream"?和 "ofstream" 来作输入输出。   如果你用过标准控制台流"cin"?和 "cout," 那现在的事情对你来说很简单。 我们现在开始讲输出部 分,首先声明一个类对象。 ofstream fout;   这就可以了,不过你要打开一个文件的话, 必须像这样调用ofstream::open()。 fout.open("output.txt");   你也可以把文件名作为构造参数来打开一个文件. ofstream fout("output.txt");   这是我们使用的方法, 因为这样创建和打开一个文件看起来更简单. 顺便说一句, 如果你要打开的文 件不存在,它会为你创建一个, 所以不用担心文件创建的问题. 现在就输出到文件,看起来和"cout"的操 作很像。 对不了解控制台输出"cout"的人, 这里有个例子。 int num = 150; char name[] = "John Doe"; fout << "Here is a number: " << num << " "; fout << "Now here is a string: " << name << " ";   现在保存文件,你必须关闭文件,或者回写文件缓冲. 文件关闭之后就不能再操作了, 所以只有在你 不再操作这个文件的时候才调用它,它会自动保存文件。 回写缓冲区会在保持文件打开的情况下保存文 件, 所以只要有必要就使用它。回写看起来像另一次输出, 然后调用方法关闭。像这样: fout << flush; fout.close();    现在你用文本编辑器打开文件,内容看起来是这样:   Here is a number: 150 Now here is a string: John Doe   很简单吧! 现在继续文件输入, 需要一点技巧, 所以先确认你已经明白了流操作,对 "<>" 比较熟悉了, 因为你接下来还要用到他们。继续…   二、ASCII 输入   输入和"cin" 流很像. 和刚刚讨论的输出流很像, 但你要考虑几件事情。在我们开始复杂的内容之前 , 先看一个文本:   12 GameDev 15.45 L This is really awesome!   为了打开这个文件,你必须创建一个in-stream对象,?像这样。 ifstream fin("input.txt");   现在读入前四行. 你还记得怎么用"<<" 操作符往流里插入变量和符号吧?好,?在 "<>" (提取) 操作符. 使用方法是一样的. 看这个代码片段.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值