您的位置:首页 > 其它

C程序设计语言--输入/输出

2013-10-03 10:23 295 查看
首先拿这本书“开刀”,随便挑一章解析,精读!!!

这里的输入/输出介绍的是标准库,讲述一些输入/输出函数、字符串处理函数、存储管理函数与数学函数,以及其他一些C语言程序的功能,重点为输入./输出。在前一些列的文章中,分别介绍了文件I/O标准I/O库高级I/O,当然这些都是和系统相关的,这里仅仅是标准库中的I/O。

一、标准输入/输出

这是从语言的角度分析I/O,但是在前面已经从三个方面(文件I/O,标准I/O,高级I/O)分析了I/O。

文本流由一些列行组成,每一行的结尾是一个换行符。如果系统没有遵循这种模式,则标准库将通过一些措施使得该系统适应这种模式。例如,标准库可以在输入端将回车符和换行符转换为换行符,而在输出端进行反向转换。

getchar()函数从标准输入中(一般为键盘)一次读取一个字符:

int getchar(void);此函数在每次被调用时返回下一个输入字符。若到文件结尾,则返回EOF。EOF一般都为-1.有时使用符号<来实现输入重定向,它将把键盘输入替换为文件输入:如果程序prog中使用了函数getchar,则命令行

prog<infile使得prog从输入文件infile中读取字符。

函数int putchar(int)用于输出数据。putchar(c)将字符c送至标准输出上,没有错误,则函数putchar将返回输出的字符;发生错误,则返回EOF。

使用输入/输出库函数的每个源程序文件必须在引用这些函数之前包含下列语句:#include <stdio.h>。当文件名用一对尖括号<>括起来,预处理器将在具体实现定义的有关位置中查找指定的文件(例如,在UNIX系统中,文件一般放在目录/usr/include中)。

许多程序只从一个输入流中读取数据,并且只向一个输出流中输出数据。对于这样的程序,只需要使用函数getchar、putchar和printf实现输入/输出即可,并且对程序来说已经足够了。

#include <stdio.h>

#include <stdlib.h>
#include <ctype.h>
int main()

{

    int c;

    while((c=getchar())!=EOF)

          putchar(tolower(c));

    return 0;

}

对于这一节的课后习题



int main(int argc,char *argv[])
{
	int i=0,c;
//printf("%s\n",argv[0]);
		for(i=0;argv[0][i]!=0;i++)
		{
//		printf("%c\n",argv[0][i]);	
putchar(tolower(argv[0][i]));
			}

	return 0;
	}

可以看一下取消注释和保留注释的区别。

二、格式化输出--printf函数



关于这个函数稍微有C语言基础的人都知道怎么使用,关于他的详细使用可以参考以后会续写的章节,关于本书目录中的章节。

但是关于这个函数相似的有sprintf(char *string,char *format,arg1,arg2,......);

sprintf函数和printf函数一样,按照format格式格式化参数列表arg1、arg2、.....,但它将输出结果存放到string中,而不是输出到标准输出中。当让,string必须足够大以存放输出结果。但是现在更多的使用snprinf()。

三、格式化输入--scanf函数

输入函数scanf对应于输出函数printf,它在与后者相反的方向上提供同样的转换功能。int scanf(char *format,.....);scanf函数从标准输入中读取字符序列,按照format中的格式说明对字符序列进行解释,并把结果保存到其余的参数中。

还有一个输入函数sscanf,它用于从一个字符串中读取字符序列,它按照格式参数format中规定的格式扫描字符串string,并把结果分别保存到arg1、arg2,这些参数必须是指针。

格式串通常包含转换说明,用于控制输入的转换。格式串可能包含下列部分:

空格或制表符,在处理过程中将被忽略。
普通字符,用于匹配输入流中下一个非空字符
转换说明,依次由一个%、一个可选的赋值禁止字符*、一个可选的数值组成。


其中注意sscanf()和sprintf()的区别和联系,一个是将第一个参数通过第二个参数的格式赋值给后面的变量;一个是将第三个参数中的值填充到第二个参数的相应位置后,赋值给第一个参数。


同时注意scanf和sscanf函数的所有参数都必须是指针。

四、文件访问

这个过程其实相当于文件I/O的部分。在读写一个文件之前,必须通过库函数fopen打开该文件。fopen用类似于x.c和y.c这样的外部名与操作系统进行某些必要的连接和通信,并返回一个随后可以用于文件读写操作的指针。

该指针称为文件指针,它指向一个包含文件信息的结构,信息包括:缓冲区的位置、缓冲区当前字符的位置、文件的读写状态、是否出错或是否已经到达文件结尾等等。在头文件中定义了一个包含这些信息的结构FILE。在程序中只需按照下列方式声明一个文件指针即可:

FILE *fopen(char *name,char *mode);

文件打开后,就需要考虑采用哪种方法对文件进行读写。其中,getc和putc函数最为简单。getc从文件中返回下一个字符,它需要知道文件指针,以确定对那个文件执行操作:int getc(FILE *fp); getc函数返回fp指向的输入流中的下一个字符。如果到达文件末尾或出错,该函数将返回EOF.putc(int
c,FILE *fp)是一个输出函数,该函数将字符c写入到fp指向的文件中,并返回写入的字符。如果发生错误,则返回EOF.类似于getchar和putchar,getc和putc是宏而不是函数。


对于文件的格式化输入或输出,可以使用函数fscanf和fprintf。它们与scanf和printf函数的区别仅仅在于他们的第一个参数是一个指向所要读写的文件的指针,第二个参数是格式串:

int fscanf(FILE *fp,char *format,....)

int fprintf(FILE *fp,char *format,.....)

从这里也可以看出来,文件i/o和标准I/O用的函数是不同的,同时注意他们的区别,stdin和stdout都是常量,不是变量

int fclose(FILE *fp)执行和fopen相反的操作,它断开有fopen函数建立的文件指针和外部名之间的链接,并释放文件指针以供其他文件使用。另一个原因:它将把缓冲区中由putc函数正在收集的输出写到文件中。

如果流fp中出现错误,则函数ferror返回一个非0值。int ferror(FILE *fp)。函数feof(FILE *fp)与ferror类似。如果指定的文件到达文件末尾,它将返回一个非0值。int feof(FILE *fp)

五、行输入和行输出

char *fgets(char *line,int maxline,FILE *fp)fgets函数从fp指向的文件中读取下一个输入行(包括换行符),并将它存放在字符数组line中,它最多可读取maxline-1个字符、读取的行将以‘\0’结尾保存到数组中。通常情况下,fgets返回line,但如果遇到了文件结尾或发生了错误,则返回NULL。

输出函数fputs将一个字符串(不需要包含换行符)写入到一个文件中:

int fputs(char *line,FILE *fp),如果发生错误,该函数将翻译EOF,否则返回一个非负值。库函数gets和puts的功能与fgets和fputs函数类似,但前者是对stdin和stdout进行操作。gets函数在读取字符串时将删除结尾的换行符'\n',而puts函数在写入字符串时将在结尾添加一个换行符。

char *fgets(char *s,int n,FILE *iop)

{

    int c;

    char cs;

    cs=s;

    while(--n>0&&(c=getc(iop))!=EOF)

       if((*cs++=c)=='\n')

           break;

       *cs='\0';

     return (c==EOF&&cs==s)?NULL:s;

}

int puts(char *s,FILE *iop)

{

    int c;

    while(c=*cs++)

       putc(c,iop);

    return ferror(iop)?EOF:0;

}

从上变的程序中也可以看出来,文件的结尾(EOF,使用这个的时候需要用int比较,可以使用feof)、字符串的结尾(\0)、换行符(\n)是有区别的

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLINE 128
int main(int argc,char *argv[])
{
	FILE *fp1,*fp2;
	char str1[MAXLINE],str2[MAXLINE];
	memset(str1,0,MAXLINE);
	memset(str2,0,MAXLINE);
	if(argc<2)
		fprintf(stderr,"argc \r\n");
	fp1=fopen(argv[1],"r");
	fp2=fopen(argv[2],"r");
	if(fp1==NULL||fp2==NULL)
	{
		fprintf(stderr,"%s of %s can not open\r\n",argv[1],argv[2]);
		return 0;
		}
	while(!feof(fp1)||!feof(fp2))
	{
		fgets(str1,MAXLINE,fp1);
		fgets(str2,MAXLINE,fp2);
		if(strcmp(str1,str2))
		{
			printf("%s\n%s\n",str1,str2);
			break;
			}
		memset(str1,0,MAXLINE);
		memset(str2,0,MAXLINE);
	
		}
	fclose(fp1);
	fclose(fp2);
	return 0;
	}

这是一个课后习题的例子,打印两个文件中第一个不相同的行。

六、其他函数

1)字符串操作函数

在头文件<string.h>中有一些和字符串相关的函数,s与t为char *类型,c与n为int 类型



strcat(s,t) 将t指向的字符串连接到s指向的字符串的末尾
strncat(s,t,n) 将t指向的字符串中前n个字符连接到s指向的字符串的末尾
strcmp(s,t) 根据s指向的字符串大于(s<t)、等于(s==t)或大于(s>t)t指向的字符串的不同情况,分别返回负整数、0或者正整数
strncmp(s,t,n) 同strcmp相同,但只在前n个字符中比较
strcpy(s,t) 将t指向的字符串复制到s指向的位置
strncpy(s,t,n) 将t指向的字符串中前n个字符复制到s指向的位置
strlen(s) 返回s指向的字符串的长度
strchr(s,c) 在s指向的字符串中查找c,若找到,则返回指向的第一次出现的位置,否则返回NULL
strtchr(s,c) 在s指向的字符串中查找c,若找到,则返回指向它最后一次出现的位置的指针,否则返回NULL

2)字符类别测试和转换函数

在头文件<ctype.h>中定义了一些用于字符测试和专函的函数。在下面的函数中,c是一个可表示为unsigned char类型或EOF的int对象。该函数的返回值类型为int.

isalpha(c) 若c是字符,则返回一个非0值,否则返回0
isupper(c) 若c是大写字母,则返回一个非0值,否则返回0
islower(c) 若c是小写字母,则返回一个非0值,否则返回0
isdigit(c) 若c是数字,则返回一个非0值,否则返回0
isalnum(c) 若isalpha(c)或isdigit(c),则返回一个非0值,否则返回0
isspace(c) 若c是空格、横向制表符、换行符、回车符、换页符或纵向制表符则返回非0
toupper(c) 返回c的大写形式
tolower(c) 返回c的小写形式



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐