C++学习:输入输出I/O
来源:互联网 发布:iphone5怎么开3g网络 编辑:程序博客网 时间:2024/06/05 14:21
1、scanf函数
(1)函数scanf识别某个指定类型的数据的过程,在遇到了指定的字符或空白符或不可识别的字符时终止。对于字符串类型的数据,输入过程直到读入空白符为止,并且会自动在读入的字符串后面加上一个'/0'。
(2)如果要输入包含空格的字符串,则相应的格式控制字符串"%s"应写成"%[...]",并把允许在输入字符串中出现的字符逐个列在方括号中。对于字母和数字,可以用符号'-'来缩写。例如 :
char s[10];
scanf("%[a-zA-Z0-9 ]",s); //注:0-9后面有一个空格,表示输入中可以有空格
(3)为了控制读入的字符串的长度,可在控制字符串中指定输入字符串的最大个数。例如:
scanf("%s“,s);
(4)函数scanf/printf实现的是基本数据类型的输入/输出。
2、cout
(1)对于指针的输出有一个特例:输出指向字符串的指针(p)时,输出p所指向的字符串;而输出(void*)p时,输出字符串的首地址(p的内容)。如:
char *p="abcde";
cout<<p<<endl;
cout<<(void*)p<<endl;
运行结果如下:
abcde
0x0042501C
(2)如果用printf输出上面的例子,会出现什么结果呢?程序如下:
char *p="abcde";
printf("%s/n",p);
printf("%s/n",(void*)p);
运行结果如下:
abcde
abcde
注:因为scanf/printf实现的是基于基本数据类型的输入/输出,即使你将指针p转化成void *,函数printf仍将它当成一个字符串指针使用,因为你在格式控制的时候写的是%s。这也是printf/scanf的一个不好的地方,当你的格式控制和你的实参不一致时,往往得不到需要的结果。
(3)cin、cout、cerr以及clog实现的是基于字节流的输入/输出操作。
3、文件I/O基础
(1)、在外部存储器中保存数据的方式通常有两种:文件和数据库。
(2)、在C++中,把文件看成是由一系列字节所构成的字节串,称为流式文件,对文件中的数据的操作(输入/输出)通常是逐个字节顺序进行。
(3)、进行读/写操作时,每读入/写出一个字节,文件位置指针会自动往后移动一个字节的位置。文件读/写完毕后,通常要关闭文件,其目的是把暂存在内存缓冲区中的内容写入到文件中,并归还打开文件时申请的内存资源。
(4)、在文件中,数据的存储方式有两种:文本方式(text)和二进制方式(binary)。这两种方式的主要区别是:文本文件中只包含可显示字符和有限的几个控制字符(如'/r','/n','/t'等); 而二进制文件中可以包含任意的二进制字节。
文本方式一般用于存储具有“行”结构的数据,如源程序以及纯文本格式的数据等。
二进制方式一般用于存储无显式结构的数据,如目标代码以及二进制数据等。
下面举个例子:
对于一个整数1234567,可以用两种方式保存到文件中:
*文本方式:依次把1、2、3、4、5、6、7的ASCII码:31、32、33、34、35、36、37(16进制,共7个字节)写入文件。
*二进制方式:把整数1234567的计算机(假设为32位计算机)内部表示0012D687(16进制,共4个字节)写入文件。
注意:以二进制方式组织的文件不利于文件在不同计算机平台上使用。
对以不同文件存储的文件的读写操作是有区别的。C++的标准库对以不同方式组织的文件提供了不同的操作。
4、文件的输出操作
(1)打开文件
FILE *fopen(const char *filename,const char *mode);
mode表示打开方式,它可以为如下:
"w":打开一个外部文件用于写操作,如果外部文件已存在,则产生把它的内容清除;否则,先创建该外部文件。
"a":打开一个外部文件用于写(添加)操作。如果外部文件不存在,则先创建该外部文件。
"r":打开一个外部文件用于读操作,这时,外部文件必须存在,否则打开文件失败。
"r+":打开一个外部文件用于读/写操作。文件必须存在。
"w+":打开一个外部文件用于读/写操作。如果文件不存在,则先创建一个空文件;否则,产生清空已有文件中的内容。
"a+":打开一个外部文件用于读/添加操作。如果文件不存在,则先创建一个空文件。以这种方式打开的文件,输出操作总是在文件尾进行。
那么,如何体现文本方式和二进制方式呢:
在上面的文件打开方式字符串后添加b表示以二进制方式打开文件。默认的打开方式为文本方式。
(2)输出操作
//输出一个字符,输出成功时返回输出字符
int fputc(int c,FILE *stream);
//输出一个字符串,输出成功时返回一个非负数
int fputs(const char *string,FILE *stream);
//输出基本类型数据,返回输出的字符数
int fprintf(FILE *stream,const char *format[,argument ]...);
//按字节输出数据。参数size为字节块的尺寸;count为字节块的个数,返回实际输出的字节块的个数
size_t fwrite(const void *buffer,size_t size,size_t count,FILE *stream);
注:前3个函数主要用于以文本方式输出数据,而第4个函数则是用于以二进制方式输出数据。
函数fprintf的功能和printf类似,只不过它是把数据输出到外部文件而不是标准输出设备。
(3)输入操作
int fgetc(FILE *stream);
char *fgets(char *string,int n,FILE *stream);
int fscanf(FILE *stream,const char *format[,argument ]...);
size_t fread(const void *buffer,size_t size,size_t count,FILE *stream);
int feof(FILE *stream); //判断文件结束。当文件位置指针在末尾时,进行一次读操作将使得feof返回非零
(4)文件位置(位置指针)
int fseek(FILE *stream,long offset,int origin);
其中,origin指出参考位置,它可以是SEEK_CUR(当前位置),SEEK_END(文件末尾),SEEK_SET(文件头);offset为偏移量,它可以是正值也可以为负值。
long ftell(FILE *stream); //返回位置指针的位置
看下面的这个例子:
int i=123;
int j;
fInput=fopen("F://in.txt","w+b");
if(NULL==fInput)
{
printf("fInput=NULL /n");
return 0;
}
fprintf(fInput,"%d",i);
fscanf(fInput,"%d",&j);
注:我先写入,再读出,为什么结果却不正确呢?
这是因为fprintf(...)后,文件的位置指针已经后移,再fscanf(,,,)读取不到写入的值。因此,当对文件进行读和写的操作时,一般要用到fseek对位置指针操作。
上面的例子如果加上下面的一句话就OK了:
fseek(fInput,0,SEEK_SET);
http://hi.baidu.com/gruceelee/blog/item/678768cbfd2fa130f9dc61d0.html
- C++I/O输入输出
- C++学习:输入输出I/O
- C#-I/O输入输出之FileStream类
- C++Notes02_输入输出语句(I/O Statements)
- java输入输出--I/O操作基础知识学习
- I/O输入输出
- i/o输入输出
- I/O 输入输出
- I/O-输入输出流
- 输入输出I/O
- 输入输出流 I/O
- I/O输入输出流
- I/O 输入输出流
- C/C++输入输出函数(I/O)总结
- C语言底层的I/O输入输出总结
- Java I/O 学习笔记(2) 基本输入输出流
- Java I/O 学习笔记(3) 基本输入输出流过滤
- Java I/O 输入输出流
- Bash 基础学习笔记
- 编译GLib时提示 error: *** No iconv() implementation found in C library 的解决方法
- 3个checbox选择一个之后其余两个都不可选
- socket编程
- 递归方法的非递归实现
- C++学习:输入输出I/O
- visual studio2008可以插入3d模型
- C#自动点击外部Process按钮
- C++编译器的函数编译流程
- 如何给应用程序中的某一个窗口部件单独设置样式表?一个小细节,要设置它的objectName。
- C#获得process主窗体Title
- 口令文件浅析
- SBS 2003 中文标准版 “R2”是什么?
- The Little Schemer ── 小众Schemer?