1. 程式人生 > >C++:標準IO(輸入輸出)

C++:標準IO(輸入輸出)

輸入和輸出並不是C++語言中的正式組成成分。C和C++本身都沒有為輸入和輸出提供專門的語句結構。輸入輸出不是由C++本身定義的,而是在編譯系統提供的I/O庫中定義的。
C++的輸出和輸入是用“流”(stream)的方式實現的。

1. 輸入流與輸出流的基本操作

cout語句的一般格式為:
cout<<表示式1<<表示式2<<……<<表示式n;
cin語句的一般格式為:
cin>>變數1>>變數2>>……>>變數n;

1.1 cout輸出流

在定義流物件時,系統會在記憶體中開闢一段緩衝區,用來暫存輸入輸出流的資料。在執行cout語句時,先把插入的資料順序存放在輸出緩衝區中,直到輸出緩衝區滿或遇到cout語句中的endl(或’\n’,ends,flush)為止,此時將緩衝區中已有的資料一起輸出,並清空緩衝區。輸出流中的資料在系統預設的裝置(一般為顯示器)輸出。

一個cout語句可以分寫成若干行。如

cout<<"This is a simple C++ program."<<endl;

可以寫成

 cout<<"This is "  //注意行末尾無分號
   <<"a C++ "
   <<"program."
   <<endl; //語句最後有分號

也可寫成多個cout語句,即

cout<<"This is "; //語句末尾有分號
   cout <<"a C++ ";
   cout <<"program.";
   cout
<<endl;

以上3種情況的輸出均為

This is a simple C++ program.

在用cout輸出時,使用者不必通知計算機按何種型別輸出,系統會自動判別輸出資料的型別,使輸出的資料按相應的型別輸出。如已定義a為int型,b為float型,c為char型,則

    cout<<a<<' '<<b<<' '<<c<<endl;

會以下面的形式輸出:

4 345.789 a

當對輸出浮點數的精度有要求時,用printf("%.2f",a)最為方便。cout不加控制符的話無法控制精度。

1.2 cin輸入流

cout類似,一個cin語句可以分寫成若干行。如

    cin>>a>>b>>c>>d;

可以寫成

 cin>>a //注意行末尾無分號
   >>b //這樣寫可能看起來清晰些
   >>c
   >>d;

也可以寫成

 cin>>a;
   cin>>b;
   cin>>c;
   cin>>d;

以上3種情況均可以從鍵盤獲取輸入。
至於輸入的方式,可以是:

 1  2  3  4//↙表示回車

也可以分多行輸入資料:

   1↙
   2  3↙
   4↙

在用cin輸入時,系統會根據變數的型別從輸入流中提取相應長度的位元組。假設有

   char c1,c2;
   int a;
   float b;
   cin>>c1>>c2>>a>>b;

對於輸入

1234 56.78//注意: 34後面有空格,和56.78分隔開。

結果是

c1=1 c2=2 a=34 b=56.78

這裡輸入也可以是這樣的形式:

1 2 34 56.78↙ (在1和2之間有空格)

注意
不能用cin語句把空格字元和回車換行符作為字元輸入給字元變數,因為它們將被跳過。
如果想將空格字元或回車換行符(或任何其他鍵盤上的字元)輸入給字元變數,可以用getchar()函式。
在組織輸入流資料時,要仔細分析cin語句中變數的型別,按照相應的格式輸入,否則容易出錯。

2. 在輸入流與輸出流中使用控制符

前面介紹的是使用cout和cin時的預設格式。但有時人們在輸入輸出時有一些特殊的要求,如在輸出實數時規定欄位寬度,只保留兩位小數,資料向左或向右對齊等。C++提供了在輸入輸出流中使用的控制符(有的書中稱為操縱符)。

需要注意的是: 如果使用了控制符,在程式單位的開頭除了要加iostream標頭檔案外,還要加iomanip標頭檔案。

舉例: 輸出雙精度數。

double a=123.456789012345;//對a賦初值
(1)cout<<a;//輸出: 123.456
(2)cout<<setprecision(9)<<a;//輸出: 123.456789
(3)cout<<setprecision(6);//恢復預設格式(精度為6)
(4)cout<< setiosflags(ios∷fixed);//輸出: 123.456789
(5)cout<<setiosflags(ios∷fixed)<<setprecision(8)<<a;//輸出: 123.45678901
(6)cout<<setiosflags(ios∷scientific)<<a;//輸出: 1.234568e+02
(7)cout<<setiosflags(ios∷scientific)<<setprecision(4)<<a; //輸出: 1.2346e02

下面是整數輸出的例子:

int b=123456;//對b賦初值
(1) cout<<b;//輸出: 123456
(2) cout<<hex<<b; //輸出: 1e240
(3) cout<<setiosflags(ios∷uppercase)<<b;//輸出: 1E240
(4) cout<<setw(10)<<b<<','<<b; //輸出:  123456,123456
(5) cout<<setfill('*')<<setw(10)<<b;//輸出: **** 123456
(6) cout<<setiosflags(ios∷showpos)<<b;//輸出: +123456

3. 常用的輸入函式比較

  1. cin
  2. cin.get()
  3. cin.getline()
  4. getline()
  5. gets()
  6. getchar()

1. cin>>

用法1:最基本,也是最常用的用法,輸入一個數字:

#include <iostream>
using namespace std;
main ()
{
int a,b;
cin>>a>>b;
cout<<a+b<<endl;
}

輸入:2[回車]3[回車]
輸出:5
用法2:接受一個字串,遇“空格”、“TAB”、“回車”都結束

#include <iostream>
using namespace std;
main ()
{
char a[20];
cin>>a;
cout<<a<<endl;
}

輸入:jkljkljkl
輸出:jkljkljkl
輸入:jkljkl[空格]jkljkl //遇空格結束
輸出:jkljkl

2. cin.get()

用法1: cin.get(字元變數名)可以用來接收字元,這時可看做等價於C中的getchar()函式。它可以接收空格和回車。

#include <iostream>
using namespace std;
main ()
{
char ch;
ch=cin.get();               //或者cin.get(ch);
cout<<ch<<endl;
}

輸入:jljkljkl
輸出:j

用法2:cin.get(字元陣列名,接收字元數目)用來接收一行字串,可以接收空格

#include <iostream>
using namespace std;
main ()
{
char a[20];
cin.get(a,20);
cout<<a<<endl;
}

輸入:jkl jkl jkl
輸出:jkl jkl jkl
輸入:abcdeabcdeabcdeabcdeabcde (輸入25個字元)
輸出:abcdeabcdeabcdeabcd (接收19個字元+1個’\0’)

3. cin.getline()

接受一個字串,可以接收空格並輸出

#include <iostream>
using namespace std;
main ()
{
char m[20];
cin.getline(m,5);
cout<<m<<endl;
}

輸入:jkljkljkl
輸出:jklj
接受5個字元到m中,其中最後一個為’\0’,所以只看到4個字元輸出;
如果把5改成20:
輸入:jkljkljkl
輸出:jkljkljkl
輸入:jklf fjlsjf fjsdklf
輸出:jklf fjlsjf fjsdklf

延伸:
cin.getline()實際上有三個引數,cin.getline(接受字串的陣列m,接受個數5,結束字元)
當第三個引數省略時,系統預設為’\0’,而如果將例子中cin.getline()改為cin.getline(m,5,'a'),則當輸入jlkjkljkl時輸出jklj,輸入jkaljkljkl時,輸出jk。

當用在多維陣列中的時候,也可以用cin.getline(m[i],20)之類的用法:

#include<iostream>
#include<string>
using namespace std;
main ()
{
char m[3][20];
for(int i=0;i<3;i++)
{
cout<<"\n請輸入第"<<i+1<<"個字串:"<<endl;
cin.getline(m[i],20);
}
cout<<endl;
for(int j=0;j<3;j++)
cout<<"輸出m["<<j<<"]的值:"<<m[j]<<endl;
}

請輸入第1個字串:
kskr1
請輸入第2個字串:
kskr2
請輸入第3個字串:
kskr3
輸出m[0]的值:kskr1
輸出m[1]的值:kskr2
輸出m[2]的值:kskr3

4. getline()

接受一個字串,可以接收空格並輸出,需包含“#include<string>”

#include<iostream>
#include<string>
using namespace std;
main ()
{
string str;
getline(cin,str);
cout<<str<<endl;
}

輸入:jkljkljkl
輸出:jkljkljkl
輸入:jkl jfksldfj jklsjfl
輸出:jkl jfksldfj jklsjfl
和cin.getline()類似,但是cin.getline()屬於istream流,而getline()屬於string流,是兩個不一樣的函式。

5. gets()

接受一個字串,可以接收空格並輸出,需包含“#include<string>”

#include<iostream>
#include<string>
using namespace std;
main ()
{
char m[20];
gets(m);                       //不能寫成m=gets();
cout<<m<<endl;
}

輸入:jkljkljkl
輸出:jkljkljkl
輸入:jkl jkl jkl
輸出:jkl jkl jkl
類似cin.getline()裡面的一個例子,gets()同樣可以用在多維數組裡面:

#include<iostream>
#include<string>
using namespace std;
main ()
{
char m[3][20];
for(int i=0;i<3;i++)
{
cout<<"\n請輸入第"<<i+1<<"個字串:"<<endl;
gets(m[i]);
}
cout<<endl;
for(int j=0;j<3;j++)
cout<<"輸出m["<<j<<"]的值:"<<m[j]<<endl;
}

請輸入第1個字串:
kskr1
請輸入第2個字串:
kskr2
請輸入第3個字串:
kskr3
輸出m[0]的值:kskr1
輸出m[1]的值:kskr2
輸出m[2]的值:kskr3

gets()和cin.getline()的用法很類似,只不過cin.getline()多一個引數罷了;
這裡順帶說明一下,對於本文中的這個kskr1,kskr2,kskr3的例子,對於cin>>也可以適用,原因是這裡輸入的沒有空格,如果輸入了空格,比如“ks kr jkl[回車]”那麼cin就會已經接收到3個字串,“ks,kr,jkl”;再如“kskr 1[回車]kskr 2[回車]”,那麼則接收“kskr,1,kskr”;這不是我們所要的結果!而cin.getline()和gets()因為可以接收空格,所以不會產生這個錯誤。

6. getchar()

接收一個字元,需包含“#include<string>”

#include<iostream>
#include<string>
using namespace std;
main ()
{
char ch;
ch=getchar();                        //不能寫成getchar(ch);
cout<<ch<<endl;
}

輸入:jkljkljkl
輸出:j

注意
getchar()是C語言的函式,C++也可以相容,但是儘量不用或少用。

PS:
getchar()常用來吸收掉一個回車。例如,有若干行資料等待讀入,第一行用cin>>讀入,但由於cin會忽略回車,所以如果在第二行使用getline(cin,s)的話會發生錯誤。原因是getline(cin,s)讀取的只是第一行末尾的'\n'
正確的做法是

cin>>a;
getchar();
getline(cin,s);
...

即用一個getchar()將那個'\n'吸收掉。

相關推薦

C++標準IO輸入輸出

輸入和輸出並不是C++語言中的正式組成成分。C和C++本身都沒有為輸入和輸出提供專門的語句結構。輸入輸出不是由C++本身定義的,而是在編譯系統提供的I/O庫中定義的。 C++的輸出和輸入是用“流”(stream)的方式實現的。 1. 輸入流與輸出流的基本

IO輸入輸出-字元流

字元流定義及基本用法 如果希望在程式中操作字元。為此JDK提供了Reader和Writer。其中Reader是字元輸入流,用於從某個源裝置讀取字元,Writer是字元流出流,用於向某個目標裝置寫入字元。Reader和Writer作為字元流的頂級父類,也有許多子類。

IO輸入輸出-位元組流

一、IO流圖: 二、位元組流: 在計算機中,無論是圖片、文字、音訊還是視訊,所有的檔案都是以二進位制(位元組)形式存在。IO流中針對位元組的輸入輸出提供了一系列的流,統稱為位元組流。 在JDK中,提供了兩個抽象類InputStream和OutputSt

浙大《面向物件程式設計--java語言》學習筆記第八週異常處理與輸入輸出

8.1 異常 ArrayIndex.java package exception; import java.util.Scanner; public class ArrayIndex { public static void main(String[] args) { // TO

java基礎類庫學習六.3位元組流 字元流輸入輸出

前言: 位元組流和字元流的操作方式幾乎相同,區別只是操作的資料單元不同而已 位元組流操作的資料單元是位元組8位,字元流操作的資料單元是字元16位 輸入流 字元輸入流/位元組輸入流原始碼(輸入流的抽象基類) InputStream public abstract class

來做一個簡單的成績查詢!輸入輸出

package day20181018;/** * 成績統計系統 * @author Administrator */import java.util.Scanner;//提供計算機直接掃描鍵盤輸入方法import java.util.Arrays;//呼叫陣列中Arrays類中的方法public class

Java中I/O輸入/輸出的操作

Java的I/O技術可以將資料儲存到文字檔案、二進位制檔案甚至是ZIP壓縮檔案中,以達到永久性儲存資料的要求。 1、流概述 流是一組有序的資料序列,根據操作的型別,可分為輸入流和輸出流兩種。I/O(Input/Output)流提供了一條通道程式,可以使用這條通道把源中的位元組序列送到目的

C++】標準檔案的輸入輸出!!!

在C++裡面的IO都是以流的形式存在的,所以在對檔案進行操作的時候也是以流的形式操作的。 主要的流:ifstream、ofstream、fstream,都包含於fstream標頭檔案裡面。 ifstream:從記憶體將檔案資料讀在硬碟 ofstream:從

C++重載>>和<<輸入輸出運算符

2.4 返回 ring per dddddd adding 輸入輸出 pla using 在C++中,標準庫本身已經對左移運算符<<和右移運算符>>分別進行了重載,使其能夠用於不同數據的輸入輸出,但是輸入輸出的對象只能是 C++ 內置的數據類型(例如

java io輸入輸出 大牛經典總結轉載

轉載出處:https://www.cnblogs.com/shaohz2014/p/3652548.html  java io 流 輸入輸出 大牛經典總結       在軟體開發中,資料流和資料庫操作佔據了一個很重要的位置,所以,熟

C程式設計--對檔案的輸入輸出案例

第十章 問題一(fputc()函式的使用) 從鍵盤中輸入一些字元,逐個把他們送到磁碟上去,直到使用者輸入一個’#'鍵為止; #include<stdio.h> #include<stdlib.h>//用於 exit(0); int ma

C語言三 字串、結構體、共用體、輸入輸出

字串 字串是儲存了一些字元,最後以null(’/0’)結尾的一維字元陣列。 char str[6] = {'h','e','l','l','o','/0'}; char str[ ] = "hello" ; 還有一些字串操作函式: 1、strcpy(s1,s2) 複製s2到s1 2

python3語言學習筆記模組+輸入輸出

引入模組 import 模組名     使用時:模組名.函式名(引數) from 模組名 import 函式名 使用時:函式名(引數) import 模組名.* 使用時:函式名(引數) 格式化字串 方式一:使用str.format() 方式二:使用%格式化字串

C語言入門教程1基本的輸入輸出

輸入: 輸入的效果是當程式執行到輸入關鍵字程式碼時,計算機會指導使用者輸入後才執行後面的程式碼。能夠讓計算機執行等待輸入的關鍵字很多,今天來介紹一種常用的關鍵字scanf。該關鍵字使用的格式一般為: scanf(輸入的資料的型別,輸入的資料將要存放的地址) 。

c++實現日期類(class Date) 建構函式 拷貝構造 操作符過載輸入輸出 比較操作 算數運算 自增自減

註釋比較詳細,可以直接跑起來,直接上程式碼(vs2012 win7) 一、標頭檔案 /************** Date.h ***************/ #pragma once #include <iostream> using name

C語言檔案讀寫輸入輸出重定向

  freopen("D:\\test.txt","r",stdin);//檔案讀入 輸入重定向 freopen("D:\\test.txt","w",stdout);//檔案寫入 輸出重定向 檔案讀入(輸入重定向) freopen ( " D:\\test.txt

C++ Primer Plus學習筆記輸入輸出錯誤處理、檔案輸入輸出

1. 字元函式庫 cctype cctype是字元函式庫,用於判斷是否為大寫字母、標點符號、空格等 #include<cctype> char ch; isalpha(ch)//如果ch是字母,返回非零值,否則返回0 ispunct(ch)/

C++標準庫函式sort、rand等

STL標準庫裡有許多諸如排序、生成隨機數的函式,使用前包含標頭檔案 #include <algorithm> 排序:sort 這個函式可以傳兩個引數或三個引數。第一個引數是要排序的區間首地址,第二個引數是區間尾地址的下一地址。也就是說

C#各類控制元件的輸入輸出思維導圖、知識點分析、案例解析

第六週學習筆記—C#各類控制元件的輸入輸出 1.思維導圖   知識點彙總: 著重介紹幾個常用控制元件: 資料顯示控制元件 DataGridView控制元件 列設定 a)、列的寬度鋪滿這個控制元件   設定如下:把AutoSizeColumnsMode=Fill;//可以在屬性視窗中設定 b)、列名居中

C++筆記檔案操作練習流類庫與輸入輸出

1、什麼叫做流?流的提取和插入是指什麼?I/O流在C++中起著怎樣的作用? 解: 流是一種抽象,它負責在資料的生產者和資料的消費者之間建立聯絡,並管理資料的流動,一般意義下的讀操作在流資料抽象中被稱為(從流中)提取,寫操作被稱為(向流中)插入。作