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

原创粉丝点击