如何 把中文字符和英文字符 写入outputStream流中

如何 把中文字符和英文字符 写入outputStream流中,第1张

可以通过“FileOutputStream”创建文件实例,之后过“OutputStreamWriter”流的形式进行存储,举例: OutputStreamWriter pw = null;//定义一个流 pw = new OutputStreamWriter(new FileOutputStream(“D:/testtxt”),"GBK");//确认流的输出文件和编

printf格式输出函数,作用是向终端输出若干个任意类型的数据
一般格式为printf(“格式控制”,输出表列)

例printf(“%d,%c\n”,i,c)

格式控制作用:

1 格式说明(%):将输出的数据转换为指定的格式输出

2 普通字符。按原样输出

格式控制中的普通字符按原样输出

例printf(“%d  %d”,a,b)

  printf(“a=%d  b=%d”,a,b)

在第二个函数中双引号内的字符,除了两个%d以外,其他的普通字符按原样输出,如果a,b的值分别为3,4,则输出为a=3  b=4中间有空格

3 格式字符:

1 d格式符。%d按十进制整数数据实际长度输出;%md指定宽度(位数)m,如果数据位数小于m,则左端补空格;%ld长整型数据

2 o格式符。以八进制整数形式输出

3 x格式符。以十六进制数形式输出

4 u格式符。以十进制整数形式输出无符号数

5 c格式符。用来输出一个字符,一个整数,只要它的值在0~255之间,也可以用%c使之按字符形式输出,在输出前,系统会将该整数作为ASCII码转换成相应的字符;反之,一个字符数据也可以用整数形式输出。

6 s格式符。用来输出一个字符串。%s;%ms,输出的字符串占m列,如果字符串本身长度大于m,则突破m限制,将字符串全部输出,如果小于m,则左补空格;%-ms,如果串长小于m,则在m列范围内,字符串向左靠,右补空格;%mns,输出m列,但只取字符串左端n个字符。这n个字符输出在m列右侧,左补空格;%-mns,取n个字符输出在m列范围的左侧,右补空格,如果n>m,则m自动取n值,即保证n个字符正常输出

7 f格式符。用来输出实数(包括单双精度),以小数形式输出。%f,不指定字段宽度,使整数部分全部输出,并输出6位小数。但注意,在输出的数字中并非全部数字都是有效数字,单精度实数的有效数字一般为7位;%mnf,指定输出的数据共占m列,其中有n位小数。如果数值长度小于m,则左端补空格;%-mnf与%mnf基本相同,只是使输出的数值向左端靠,右端补空格。

8 e格式符。以指数形式输出实数

9 g格式符。用来输出实数,根据数值的大小,自动选f格式或者e格式,且不输出无意义的零。P80

格式字符

说明

d ,i

以带符号的十进制形式输出整数

O

以八进制无符号形式输出整数

X,x

以十六进制无符号形式输出整数,用x则百偶是输出十六进制数的a~f时以小写形式输出。用X时,则以大写字母输出

u

以无符号十进制形式输出整数

c

以字符形式输出,只输出一个字符

s

输出字符创

f

以小数形式输出单双精度数,隐含输出7位小数

e,E

以指数形式输出是说,用e时指数以e表示,用E时指数以E表示

g,G

选用%f或%e格式中输出宽度较短的一种格式,不输出无意义的0用G时,若以指数形式输出,则指数以大写表示
字符

说明

l

用于长整型整数,可加载个师傅d,o,x,u前面

m

数据最小宽度

n

对实数,表示输出n位小数,对字符串,表示截取的字符个数

-

输出的数字或字符在域内向左靠

注意:除了X,E,G外,其他格式字符必须用小写字母;可以在格式控制字符串内包含转义字符;格式符之间可以加入修饰符;用连续两个%来输出%

scanf(格式控制,地址表列)

scanf(“%d%d%d”,&a,&b,&c)

&为地址运算符,&a指a在内存中的地址。

1用%d%d%d输入数据时不能用逗号做两个数据间的分隔符可用空格

如果%d和%d之间有n个空格,则输入时对应的位置应该有多于n个空格来分隔

总之,%d与%d之间有什么简单符号,输入信息时候就要将这些符号加上,或者格式控制里是a=%d,则输入数据时候也得输入a=某个数据

2用%c格式输入字符时候,空格字符和转义字符都作为有效字符输入

例如:scanf(“%c%c%c”,&c1,&c2,&c3);若输入“a空格b空格c”则c1为a,c2为空格,c3为b,正确的输入法为“abc”字符间没有空格

3在输入数据时候,遇到以下情况时,认为该数据结束①遇空格,或按回车,或跳格键;②指定宽度结束,如%3d;③遇非法输入

c++中,可以直接利用string及cout进行中文的存储及输出:
代码如下:
#include <iostream>#include <string>using namespace std;
void main(){ string s1="第一"; cout<<s1<<endl; }
结果:正常输出:第一
但是有些时候不得不用到wstring来存储中文字符,这时输出需要
导入locale头文件
中文字符前需要加L,并用wstring存储
输出前更改本地语言,wcoutimbue(locale("chs"))
用wcout输出
代码如下:
#include <iostream>#include <string>#include <locale>using namespace std;
void main(){ string s1="第一"; wstring s2=L"第二"; cout<<s1<<endl; wcoutimbue(locale("chs")); wcout<<s2<<endl;}
结果如下:
第一
第二

1 InputStream 和OutputStream,两个是为字节流设计的,主要用来处理字节或二进制对象,
2 Reader和 Writer两个是为字符流(一个字符占两个字节)设计的,主要用来处理字符或字符串
字符流处理的单元为2个字节的Unicode字符,分别 *** 作字符、字符数组或字符串,而字节流处理单元为1个字节, *** 作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点
所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列
1,字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串;
2,字节流提供了处理任何类型的IO *** 作的功能,但它不能直接处理Unicode字符,而字符流就可以
字节流是最基本的,所有的InputStrem和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的 但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化 这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联 在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的

其实问题很简单,
首先,你要弄清楚 ”字符“和”字节“ 的关系。在java中一个字符是用两个字节表示的。
再看你的ch=frread(); 这是从你的文件中读出的一个字节。
Systemoutprintf();方法是向标准输出流打印一个 格式后的 字符串 ,就像C语言的printf函数一样吧ch格式化为一个字符,但是问题出现了java中一个字符是两个字节组成的,而ch只有一个字节有效(int是4个字节的,但是只用了1个字节),这里就存在一个转换的问题了,如过ch是一个英文的话很好说,原样输出(如果你要了解为什么是原样输出的话,你可以在网上去查查ascii编码和unicode编码在字节上的区别,其实很简单)。但是如果是中文的话就不行了,因为中文要用到两个字节才能表示完整的一个字。你现在只有一个字节了,这样%c就不知道格式化为什么字符了(但是肯定这个字符变成了2个字节的。)这样1个汉字就被分解成两个乱码了。方法可以把这个乱码输出到输出流上。
Systemoutprint((char)ch); 和上面是一个意思,只是方法不一样。
Systemoutwrite(ch); 是向标准输出流输出一个字节。这又有一个难以理解的地方,标准输出流是什么?怎样理解这个标准输出流?(我也不知道怎么很好的解释),标准输出流可以认为是一个字节输出的通道,java中一般这个通道默认是连接在电脑的显示设备上的。(我不专业)你可以把Systemout看成是一个容器,他可以存储字节。你向它里面可以输入字节。如果你的标准输出流终端是控制台(DOS)。你就可以想象成控制台有一个字节存储的容器。控制台可以把容器中的字节表达出来,比如java的unicode编码的字节,他会把每连个字节组合成的一个字符打印出来我们就可以看到这个字符了。这样要显示什么就直接向这个容器中输入什么字节。
真实由于这种原因Systemoutwrite(ch);这个方法可以像你那样输出汉字。一个汉字两个字节,这个方法一次可以向控制台输入一个字节,但是这两个字节最终都会输出到控制台的。因此汉字还是组成了。
上面那两个方法显示乱码的最终原因是:编码被强制改变了。一个汉字被分成了4个字节。
如果你对“把Systemout看成是一个容器”有疑惑的话,你可以做一个实验,就用write方法向控制台输出一个汉字,这个汉字两个字节的输入中暂停一下,看看输出第一个字节后和两个字节都输出了控制台打印的是什么。(呵呵 我没试过,如果有什么不一样的地方希望告诉我。。。)


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13341203.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-18
下一篇 2023-07-18

发表评论

登录后才能评论

评论列表(0条)

保存