您的位置:首页 > 编程语言 > C语言/C++

输入输出(IO)简介

2016-05-19 16:22 337 查看
本次讨论一下C、C++和Java中常用的输入输出方法。

先从C语言中的printf的格式控制的完整格式说起

%c 单个字符

%d 十进制整数

%f 十进制浮点数

%o 八进制数

%s 字符串

%u 无符号十进制数

%x 十六进制数

%% 输出百分号%

%e 指数浮点数

%a 十六进制浮点数

%x 十六进制整数

下面对组成格式说明的各项加以说明:

①%:表示格式说明的起始符号,不可缺少。

②-:有-表示左对齐输出,如省略表示右对齐输出。

③0:有0表示指定空位填0,如省略表示指定空位不填。

④m.n:m指域宽,即对应的输出项在输出设备上所占的字符数。N指精度。用于说明输出的实型数的小数位数。为指定n时,隐含的精度为n=6位。

⑤l或h:l对整型指long型,对实型指double型。h用于将整型的格式字符修正为short型。

----------------------------------

格式字符

格式字符用以指定输出项的数据类型和输出格式。

①d格式:用来输出十进制整数。有以下几种用法:

%d:按整型数据的实际长度输出。

%md:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。

%ld:输出长整型数据。

②o格式:以无符号八进制形式输出整数。对长整型可以用”%lo”格式输出。同样也可以指定字段宽度用“%mo”格式输出。

例:

int main() {

int a = -1;

printf(“%d, %o”, a, a);

}

运行结果:-1,177777

程序解析:-1在内存单元中(以补码形式存放)为(1111111111111111)2,转换为八进制数为(177777)8。

③x格式:以无符号十六进制形式输出整数。对长整型可以用”%lx”格式输出。同样也可以指定字段宽度用”%mx”格式输出。

④u格式:以无符号十进制形式输出整数。对长整型可以用”%lu”格式输出。同样也可以指定字段宽度用“%mu”格式输出。

⑤c格式:输出一个字符。

⑥s格式:用来输出一个串。有几中用法

%s:例如:printf(“%s”, “CHINA”)输出”CHINA”字符串(不包括双引号)。

%ms:输出的字符串占m列,如字符串本身长度大于m,则突破获m的限制,将字符串全部输出。若串长小于m,则左补空格。

%-ms:如果串长小于m,则在m列范围内,字符串向左靠,右补空格。

%m.ns:输出占m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧,左补空格。

%-m.ns:其中m、n含义同上,n个字符输出在m列范围的左侧,右补空格。如果n>m,则自动取n值,即保证n个字符正常输出。

⑦f格式:用来输出实数(包括单、双精度),以小数形式输出。有以下几种用法:

%f:不指定宽度,整数部分全部输出并输出6位小数。

%m.nf:输出共占m列,其中有n位小数,如数值宽度小于m左端补空格。

%-m.nf:输出共占n列,其中有n位小数,如数值宽度小于m右端补空格。

⑧e格式:以指数形式输出实数。可用以下形式:

%e:数字部分(又称尾数)输出6位小数,指数部分占5位或4位。

%m.ne和%-m.ne:m、n和”-”字符含义与前相同。此处n指数据的数字部分的小数位数,m表示整个输出数据所占的宽度。

⑨g格式:自动选f格式或e格式中较短的一种输出,且不输出无意义的零。

关于printf函数的进一步说明:

如果想输出字符”%”,则应该在“格式控制”字符串中用连续两个%表示,如:

printf(“%f%%”, 1.0/3);

输出0.333333%。

对于单精度数,使用%f格式符输出时,仅前7位是有效数字,小数6位.

对于双精度数,使用%lf格式符输出时,前16位是有效数字,小数6位. 对于m.n的格式还可以用如下方法表示(例)

char ch[20];

printf(“%*.*s\n”,m,n,ch);

前边的*定义的是总的宽度,后边的定义的是输出的个数。分别对应外面的参数m和n 。我想这种方法的好处是可以在语句之外对参数m和n赋值,从而控制输出格式。

下面来自百度,部分已验证

这里是Java代码

double d = 345.678;

String s = "hello!";

int i = 1234;

//"%"表示进行格式化输出,"%"之后的内容为格式的定义。

System.out.printf("%f",d);//"f"表示格式化输出浮点数。  //345.678000

System.out.printf("%9.2f",d);//"9.2"中的9表示输出的长度,2表示小数点后的位数。//   345.68  System.out.printf("%+9.2f",d);//"+"表示输出的数带正负号。  //  +345.68

System.out.printf("%-9.4f",d);//"-"表示输出的数左对齐(默认为右对齐)。 //345.6780

System.out.printf("%+-9.3f",d);//"+-"表示输出的数带正负号且左对齐。  //+345.678

System.out.printf("%d",i);//"d"表示输出十进制整数。  //1234

System.out.printf("%o",i);//"o"表示输出八进制整数。  //2322

System.out.printf("%x",i);//"d"表示输出十六进制整数。  //4d2

System.out.printf("%#x",i);//"d"表示输出带有十六进制标志的整数。  //0x4d2

System.out.printf("%s",s);//"d"表示输出字符串。  //hello!

System.out.printf("输出一个浮点数:%f,一个整数:%d,一个字符串:%s",d,i,s);//可以输出多个变量,注意顺序。  //输出一个浮点数:345.678000,一个整数:1234,一个字符串:hello!

System.out.printf("字符串:%2$s,%1$d的十六进制数:%1$#x",i,s);//"X$"表示第几个变量。

//字符串:hello!,1234的十六进制数:0x4d2


C语言中scanf()函数

scanf()函数读入一个字符串。多一句,scanf()和gets()的最大差别在于它们如何决定字符串何时结束。scanf()更基于获取单词而不是字符串,但是gets()则会读入所有的字符,直到遇见第一个换行符为止。

scanf()使用两种方法决定输入结束,无论哪一种都是字符串以遇见第一个非空白字符开始。如果使用%s格式,字符字符串读到(但是不包括)下一个空白字符(比如空格、制表符或者换行)终止。如果指定了字段宽度,比如%10s,scanf()就会读入10个字符或者遇到第一个空白字符,由二者最先满足的那一个终止输入。

printf()在此不再叙述。

C++中的输入输出简介

输入输出流

cout<< 和 cin>>

cout语句的一般格式为

cout<<表达式1<<表达式2<<…<<表达式n

cin语句的一般格式为

cin>>变量1>>变量2>>…..>>变量n

在定义流对象时,系统会在内存中开辟一段缓冲区,用来暂存输入输出流的数据。在执行cout语句时,并不是插入一个数据就马上输出一个数据,而是先把插入的数据顺序的存放在输出缓冲区中,直到输出缓冲区满或遇到cout语句中的endl(或’\n’,ends,flush)为止,此时将缓冲区中已有的数据一起输出,并清空缓冲区。

控制符作用
dec设置数值的基数为10
hex设置数值的基数为16
oct设置数值的基数为8
setfill(c)设置填充字符c,c可以是字符串常量或字符变量
setprecision(n)设置浮点数的精度为n位。在以一般十进制小数形式输出时,n代表有效数字。在以fixed(固定小数位数)形式和scientific(指数)形式输出时,n为小数位。
setw(n)设置字段宽度为n
setiosflags(ios :: fixed) 设置浮点数以固定的小数位数显示
setiosflags(ios :: scientific)设置浮点数以科学记数法(即指数形式)显示
setiosflags(ios :: left)输出数据左对齐
setiosflags(ios :: right)输出格式右对齐
setiosflags(ios :: skipws)忽略前导的空格
setiosflags(ios :: uppercase)数据以十六进制形式输出时字母以大写表示
setiosflags(ios :: lowercase)数据以十六进制形式输出时字母以小写表示
setiosflags(ios :: showpos)输出正数时给出”+”号
需要注意的是,在使用控制符时,需要在头文件中加入iomaniip头文件
Java中Scanner类的两种用法

Java 5添加了java.util.Scanner类,这是一个用于扫描输入文本的新的实用程序。

它是以前的StringTokenizer和Matcher类之间的某种结合。

由于任何数据都必须通过同一模式的捕获组检索或通过使用一个索引来检索文本的各个部分。于是可以结合使用正则表达式和从输入流中检索特定类型数据项的方法。

这样,除了能使用正则表达式之外,Scanner类还可以任意地对字符串和基本类型(如int和double)的数据进行分析。

借助于Scanner,可以针对任何要处理的文本内容编写自定义的语法分析器。

Scanner是SDK1.5新增的一个类,可是使用该类创建一个对象.

  

Scanner reader=new Scanner(System.in);

  

然后reader对象调用下列方法(函数),读取用户在命令行输入的各种数据类型:

  

next.Byte(),nextDouble(),nextFloat,nextInt(),nextLine(),nextLong(),nextShot()

  

上述方法执行时都会造成堵塞,等待用户在命令行输入数据回车确认.

例如,用户在键盘输入12.34,

hasNextFloat()的值是true,而hasNextInt()的值是false.

NextLine()等待用户输入一个文本行并且回车,该方法得到一个String类型的数据。

下面是一个实例:

import java.util.*;

public class Example {
public static void main(String args[]) {
System.out.println("请输入若干个数,每输入一个数用回车确认");
System.out.println("最后输入一个非数字结束输入操作");
Scanner reader = new Scanner(System.in);
double sum = 0;
int m = 0;
while (reader.hasNextDouble()) {
double x = reader.nextDouble();
m = m + 1;
sum = sum + x;
}
System.out.printf("%d个数的和为%f\n", m, sum);
System.out.printf("%d个数的平均值是%f\n", m, sum / m);
}
}


这是一个从1加到9的简单算数,Scanner从str字串中依次取出1-9这个数字,将它们相加,最后的输出结果是:

TOTAL:45

下面是第二个实例:

import java.util.Scanner;

public class Test{
public static void main(String[] args){
String str="1 2 3 4 5 6 7 8 9";
Scanner scanner=new Scanner(str);
int total=0;
while(scanner.hasNext()){
total+=scanner.nextInt();
}
System.out.println("TOTAL:"+total);
scanner.close();
}
}


Scanner用于分解字符串的默认的分隔符是空格,当然也可以定制,在这里类似于StringTokenizer类的delim。Scanner也提供了从输入源获取字串的构建器,在使用完之后,都应调用scanner.close()来关闭!

顺便提一下,在百度上有人说,上述方法执行时都会造成堵塞,等待用户在命令行输入数据回车确认.例如,拥护在键盘输入12.34,hasNextFloat()的值是true,而hasNextInt()的值是false. NextLine()等待用户输入一个文本行并且回车,该方法得到一个String类型的数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c java C++ ACM 输入输出