请高手提供一些C语言中常用的库函数,并说明它的作用和所在头文件.字符处理函数
本类别函数用于对单个字符进行处理c语言库函数示例 , 包括字符的类别测试和字符的大小写转换
头文件 ctype.h
函数列表
函数类别 函数用途 详细说明
字符测试 是否字母和数字 isalnum
是否字母 isalpha
是否控制字符 iscntrl
是否数字 isdigit
是否可显示字符(除空格外) isgraph
是否可显示字符(包括空格) isprint
是否既不是空格,又不是字母和数字的可显示字符 ispunct
是否空格 isspace
是否大写字母 isupper
是否16进制数字(0-9,A-F)字符 isxdigit
字符大小写转换函数 转换为大写字母 toupper
转换为小写字母 tolower
地区化
本类别的函数用于处理不同国家的语言差异 。
头文件 local.h
函数列表
函数类别 函数用途 详细说明
地区控制 地区设置 setlocale
数字格式约定查询 国家的货币、日期、时间等的格式转换 localeconv
数学函数
本分类给出c语言库函数示例了各种数学计算函数,必须提醒的是ANSI C标准中的数据格式并不符合IEEE754标准,一些C语言编译器却遵循IEEE754(例如frinklin C51)
头文件 math.h
函数列表
函数类别 函数用途 详细说明
错误条件处理 定义域错误(函数的输入参数值不在规定的范围内)
值域错误(函数的返回值不在规定的范围内)
三角函数 反余弦 acos
反正弦 asin
反正切 atan
反正切2 atan2
余弦 cos
正弦 sin
正切 tan
双曲函数 双曲余弦 cosh
双曲正弦 sinh
双曲正切 tanh
指数和对数 指数函数 exp
指数分解函数 frexp
乘积指数函数 fdexp
自然对数 log
以10为底的对数 log10
浮点数分解函数 modf
幂函数 幂函数 pow
平方根函数 sqrt
整数截断,绝对值和求余数函数 求下限接近整数 ceil
绝对值 fabs
求上限接近整数 floor
求余数 fmod
本分类函数用于实现在不同底函数之间直接跳转代码 。头文件 setjmp.h io.h
函数列表
函数类别 函数用途 详细说明
保存调用环境 setjmp
恢复调用环境 longjmp
信号处理
该分类函数用于处理那些在程序执行过程中发生例外的情况 。
头文件 signal.h
函数列表
函数类别 函数用途 详细说明
指定信号处理函数 signal
发送信号 raise
可变参数处理
本类函数用于实现诸如printf,scanf等参数数量可变底函数 。
头文件 stdarg.h
函数列表
函数类别 函数用途 详细说明
可变参数访问宏 可变参数开始宏 va_start
可变参数结束宏 va_end
可变参数访问宏 访问下一个可变参数宏 va_arg
输入输出函数
该分类用于处理包括文件、控制台等各种输入输出设备 , 各种函数以“流”的方式实现
头文件 stdio.h
函数列表
函数类别 函数用途 详细说明
文件操作
删除文件 remove
修改文件名称 rename
生成临时文件名称 tmpfile
得到临时文件路径 tmpnam
文件访问 关闭文件 fclose
刷新缓冲区 fflush
打开文件 fopen
将已存在的流指针和新文件连接 freopen
设置磁盘缓冲区 setbuf
设置磁盘缓冲区 setvbuf
格式化输入与输出函数 格式输出 fprintf
格式输入 fscanf
格式输出(控制台) printf
格式输入(控制台) scanf
格式输出到缓冲区 sprintf
从缓冲区中按格式输入 sscanf
格式化输出 vfprintf
格式化输出 vprintf
格式化输出 vsprintf
字符输入输出函数 输入一个字符 fgetc
字符串输入 fgets
字符输出 fputc
字符串输出 fputs
字符输入(控制台) getc
字符输入(控制台) getchar
字符串输入(控制台) gets
字符输出(控制台) putc
字符输出(控制台) putchar
字符串输出(控制台) puts
字符输出到流的头部 ungetc
直接输入输出 直接流读操作 fread
直接流写操作 fwrite
文件定位函数 得到文件位置 fgetpos
文件位置移动 fseek
文件位置设置 fsetpos
得到文件位置 ftell
文件位置复零位 remind
错误处理函数 错误清除 clearerr
文件结尾判断 feof
文件错误检测 ferror
得到错误提示字符串 perror
实用工具函数
本分类给出c语言库函数示例了一些函数无法按以上分类,但又是编程所必须要的 。
头文件 stdlib.h
函数列表
函数类别 函数用途 详细说明
字符串转换函数 字符串转换为整数 atoi
字符串转换为长整数 atol
字符串转换为浮点数 strtod
字符串转换为长整数 strtol
字符串转换为无符号长整型 strtoul
伪随机序列产生函数 产生随机数 rand
设置随机函数的起动数值 srand
存储管理函数 分配存储器 calloc
释放存储器 free
存储器分配 malloc
重新分配存储器 realloc
环境通信 中止程序 abort
退出程序执行,并清除环境变量 atexit
退出程序执行 exit
读取环境参数 getenv
程序挂起,临时执行一个其c语言库函数示例他程序 system
搜索和排序工具 二分查找(数据必须已排序) bsearch
快速排序 qsort
整数运算函数 求绝对值 abs
div
得到除法运算底商和余数
求长整形底绝对值 labs
求长整形除法的商和余数 ldiv
多字节字符函数 得到多字节字符的字节数 mblen
得到多字节字符的字节数 mbtowc
多字节字符转换 wctomb
多字节字符的字符串操作 将多字节串转换为整数数组 mbstowcs
将多字节串转换为字符数组 mcstowbs
字符串处理
本分类的函数用于对字符串进行合并、比较等操作
头文件 string.h
函数列表
函数类别 函数用途 详细说明
字符串拷贝 块拷贝(目的和源存储区不可重叠) memcpy
块拷贝(目的和源存储区可重叠) memmove
串拷贝 strcpy
按长度的串拷贝 strncpy
字符串连接函数 串连接 strcat
按长度连接字符串 strncat
串比较函数 块比较 memcmp
字符串比较 strcmp
字符串比较(用于非英文字符) strcoll
按长度对字符串比较 strncmp
字符串转换 strxfrm
字符与字符串查找 字符查找 memchr
字符查找 strchr
字符串查找 strcspn
字符串查找 strpbrk
字符串查找 strspn
字符串查找 strstr
字符串分解 strtok
杂类函数 字符串设置 memset
错误字符串映射 strerror
求字符串长度 strlen
日期和时间函数
本类别给出时间和日期处理函数
头文件 time.h
函数列表
函数类别 函数用途 详细说明
时间操作函数 得到处理器时间 clock
得到时间差 difftime
设置时间 mktime
得到时间 time
时间转换函数 得到以ASCII码表示的时间 asctime
得到字符串表示的时间 ctime
得到指定格式的时间 strftime
函数库未来的发展方向
本部分用于说明各类别函数库在将来如何发展 。
序号 库类别 头文件 详细说明
1 错误处理 errno.h
2 字符处理 ctype.h
3 地区化 local.h
4 数学函数 math.h
5 信号处理 signal.h
6 输入输出 stdio.h
7 实用工具程序 stdlib.h
8 字符串处理 string.h
C语言库函数如何编写?/***
*printf.c - print formatted
*
* Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
* defines printf() - print formatted data
*
*******************************************************************************/
#include
#include
#include
#include
#include
#include
#include
/***
*int printf(format, ...) - print formatted data
*
*Purpose:
* Prints formatted data on stdout using the format string to
* format data and getting as many arguments as called for
* Uses temporary buffering to improve efficiency.
* _output does the real work here
*
*Entry:
* char *format - format string to control data format/number of arguments
* followed by list of arguments, number and type controlled by
* format string
*
*Exit:
* returns number of characters printed
*
*Exceptions:
*
*******************************************************************************/
int __cdecl printf (
const char *format,
...
)
/*
* stdout ''PRINT'', ''F''ormatted
*/
{
va_list arglist;
int buffing;
int retval;
va_start(arglist, format);
_ASSERTE(format != NULL);//断言宏 。如果输出格式字符串指针为空 , 则在DEBUG版下断言,报告错误 。
_lock_str2(1, stdout);
buffing = _stbuf(stdout);//stdout:指定输出到屏幕
retval = _output(stdout,format,arglist);
_ftbuf(buffing, stdout);
_unlock_str2(1, stdout);
return(retval);
}
以上为printf()c语言库函数示例的源代码
1、从含有可选参数函数中获得可选参数,以及操作这些参数
typedef char *va_list;
void va_start( va_list arg_ptr, prev_param );
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
假定函数含有一个必选参数和多个可选参数 , 必选参数声明为普通数据类型,且能通过参数名来获得该变量的值 。可选参数通过宏va_start、va_arg和va_end(定义在stdarg.h或varargs.h中)来进行操作,即通过设置指向第一个可选参数指针、返回当前参数、在返回参数后重新设置指针来操作所有的可选参数 。
va_start:为获取可变数目参数的函数的参数提供一种便捷手段 。设置arg_ptr为指向传给函数参数列表中的第一个可选参数的指针,且该参数必须是va_list类型 。prev_param是在参数列表中第一个可选参数前的必选参数 。
va_argc语言库函数示例:返回由arg_ptr所指向的参数的值,且自增指向下一个参数的地址 。type为当前参数的类型 , 用来计算该参数的长度 , 确定下一个参数的起始位置 。它可以在函数中应用多次,直到得到函数的所有参数为止,但必须在宏va_start后面调用 。
va_end:在获取所有的参数后 , 设置指针arg_ptr为NULL 。
下面举例说明c语言库函数示例:
#include
#include
int average( int first, ... );
void main( void )
{
/* Call with 3 integers (-1 is used as terminator). */
printf( "Average is: %d\n", average( 2, 3, 4, -1 ) );
/* Call with 4 integers. */
printf( "Average is: %d\n", average( 5, 7, 9, 11, -1 ) );
/* Call with just -1 terminator. */
printf( "Average is: %d\n", average( -1 ) );
}
int average( int first, ... )
{
int count = 0, sum = 0, i = first;
va_list marker;
va_start( marker, first ); /* Initialize variable arguments. */
while( i != -1 )
{
sum= i;
count;
i = va_arg( marker, int);
}
va_end( marker ); /* Reset variable arguments. */
return( sum ? (sum / count) : 0 );
}
返回值为:
Average is: 3
Average is: 8
Average is: 0
综上所述 , 在printf()函数中 , 可以只输出一个字符串,也可按照一定的形式输出含有多个可选参数的字符串信息 。因此,首先就要通过这些宏来获取所有的可选参数 。在上面的源码可以看出printf()中,只使用了宏at_start,将可选参数的首地址赋给了arglist 。
2、锁定字符串及输出字符串到屏幕
#define _lock_str2(i,s) _lock_file2(i,s)
void __cdecl _lock_file2(int, void *);
#define _unlock_str2(i,s) _unlock_file2(i,s)
void __cdecl _unlock_file2(int, void *);
int __cdecl _stbuf(FILE *);
void __cdecl _ftbuf(int, FILE *);
int __cdecl _output(FILE *, const char *, va_list);
在output函数中,读取格式字符串中的每一个字符,然后对其进行处理,处理方式根据每一个字符所代表的意义来进行 , 如:普通字符直接利用函数WRITE_CHAR(ch, charsout);输出到控制台 。
其中的主要部分是对转换说明符(d,c,s,f)的处理,现在将对其中的部分代码进行详细说明,这里只说明最基本的转换说明符 , 对这些须基本的转换说明符进行修饰的修饰符,程序中单独进行处理 。下面是函数output()(output.c)部分源代码:
case ST_TYPE:
//表示当前处理的字符的类型为转换说明符 。
...
switch (ch) {
//下面对参数的获取都是利用宏va_arg( va_list arg_ptr, type );来进行的 。
case ''c'': {
//从参数表中获取单个字符,输出到缓冲字符串中,此时 , type=int
buffer[0] = (char) get_int_arg(argptr); /* get char to print */
text = buffer;
textlen = 1; /* print just a single character */
}
break;
case ''s'': {
//从参数表中获取字符串,输出到缓冲字符串中,此时,type=char*
int i;
char *p; /* temps */
text = get_ptr_arg(argptr);
...
}
break;
case ''w'': {
//对宽字符进行处理
...
} /* case ''w'' */
break;
...
case ''e'':
case ''f'':
case ''g'': {
//对浮点数进行操作
...
#if !LONGDOUBLE_IS_DOUBLE
/* do the conversion */
if (flagsFL_LONGDOUBLE) {
_cldcvt((LONGDOUBLE*)argptr, text, ch, precision, capexp);
va_arg(argptr, LONGDOUBLE);
//对长双精度型进行处理,此时,type=long double
}
else
#endif /* !LONGDOUBLE_IS_DOUBLE */
{
//对双精度型进行处理,此时,type=double
_cfltcvt((DOUBLE*)argptr, text, ch, precision, capexp);
va_arg(argptr, DOUBLE);
}
...
break;
//对整型变量处理
case ''d'':
case ''i'':
...
goto COMMON_INT;
case ''u'':
radix = 10;
goto COMMON_INT;
case ''p'':
...
goto COMMON_INT;
case ''o'':
...
注:对于浮点型double和long double,有相应的转换说明符(%f表示双精度型,%lf表示长双精度型),而float却没有 。其中的原因是 , 在KRC下,float值用于表达式或用作参数前,会自动转换成double类型 。而ANSI C一般不会自动把float转换成double 。有些程序已假定其中的float参数会被转换成double,为了保护大量这样的程序 , 所有printf()函数的float参数还是被自动转换成double型 。因此,在KRC或ANSI C下,都无需用特定的转换说明符来显示float型 。
综上所述 , 转换说明符必须与待打印字符的类型 。通常,用户有种选择 。例如,如要打印一个int类型的值 。则只可以使用%d,%x或%o 。所有这些说明符都表示要打印一个int类型的值;它们只不过提供了一个数值的几种不同表示 。类似一,可以用%f、%g和%e来表示double类型的值 。但如果转换说明与类型不匹配 , 将会出现意想不到的结果 。为什么呢c语言库函数示例?问题就在于C向函数传递信息的方式 。
这个失败的根本细节与具体实现相关 。它决定了系统中的参数以何方式传递 。函数调用如下:
float n1;
double n2;
long n3;
long n4;
...
printf("%ld,%ld,%ld,%ld",n1,n2,n3,n4);
这个调用告诉计算机,要把变量n1,n2,n3和n4的值交给计算机,它把这些变量放进称作栈(stack)的内存区域中 , 来完成这一任务 。计算机把这些值放进栈中,其根据是变量的类型而不是转换说明符,比如n1,把8个字节放入栈中(float被转换成double) , 类似地,为n2放了8字节,其后给n3和n4各放了4个字节 。接着,控制的对象转移到printf();此函数从栈中读数,不过在这一过程中 , 它是在转换说明符的指导下,读取数值的 。说明符%ld指定printf()应读4个字节(va_arg( va_list arg_ptr, type )中type=long),因此printf()读入栈中的4个字节 , 作为它的第一个值 。但是这只是n1的前半部分,这个值被看成一个long整数 。下一个说明符%ld读入4个字节,这正是n1的后半部分 , 这个值被看成第二个long整数 。类似地,第三、第四次又读入n2的前后两部分 。因此,尽管我们对n3和n4使用了正确的说明符,printf()仍然会产生错误 。
能列举些C语言中比较常见重要库函数的用法吗?我的建议是去看MSDN,里面有详细的库函数的说明和使用方法 。C的库函数有很多 , 一条条说不现实 , 就是一个专业的程序员也不可能将库函数都记下来 。我从网上搜了点库函数的用法,你看看吧 。还是那句话 , 想了解库函数,还是看MSDN 。
下面也是我从网上找到的 。网上这种东西很多 。但我认为要是真正精通,还是MSDN
文件的打开(fopen函数)
fopen函数用来打开一个文件,其调用的一般形式为:
文件指针名=fopen(文件名,使用文件方式);
其中,
“文件指针名”必须是被说明为FILE 类型的指针变量;
“文件名”是被打开文件的文件名;
“使用文件方式”是指文件的类型和操作要求 。
“文件名”是字符串常量或字符串数组 。
例如:
FILE *fp;
fp=("file a","r");
其意义是在当前目录下打开文件file a,只允许进行“读”操作,并使fp指向该文件 。
又如:
FILE *fphzk
fphzk=("c:\\hzk16","rb")
其意义是打开C驱动器磁盘的根目录下的文件hzk16 , 这是一个二进制文件 , 只允许按二进制方式进行读操作 。两个反斜线“\\ ”中的第一个表示转义字符,第二个表示根目录 。
使用文件的方式共有12种,下面给出了它们的符号和意义 。
文件使用方式
意义
“rt”
只读打开一个文本文件 , 只允许读数据
“wt”
只写打开或建立一个文本文件,只允许写数据
“at”
追加打开一个文本文件,并在文件末尾写数据
“rb”
只读打开一个二进制文件,只允许读数据
“wb”
只写打开或建立一个二进制文件,只允许写数据
“ab”
追加打开一个二进制文件 , 并在文件末尾写数据
“rt ”
读写打开一个文本文件,允许读和写
“wt ”
读写打开或建立一个文本文件,允许读写
“at ”
读写打开一个文本文件,允许读,或在文件末追加数据
“rb ”
读写打开一个二进制文件 , 允许读和写
“wb ”
读写打开或建立一个二进制文件,允许读和写
“ab ”
读写打开一个二进制文件 , 允许读,或在文件末追加数据
对于文件使用方式有以下几点说明:
1) 文件使用方式由r,w,a,t,b,六个字符拼成,各字符的含义是:
r(read): 读
w(write): 写
a(append): 追加
t(text): 文本文件 , 可省略不写
b(banary): 二进制文件
: 读和写
2) 凡用“r”打开一个文件时,该文件必须已经存在,且只能从该文件读出 。
3) 用“w”打开的文件只能向该文件写入 。若打开的文件不存在,则以指定的文件名建立该文件,若打开的文件已经存在,则将该文件删去 , 重建一个新文件 。
4) 若要向一个已存在的文件追加新的信息,只能用“a”方式打开文件 。但此时该文件必须是存在的,否则将会出错 。
5) 在打开一个文件时,如果出错,fopen将返回一个空指针值NULL 。在程序中可以用这一信息来判别是否完成打开文件的工作,并作相应的处理 。因此常用以下程序段打开文件:
6) if((fp=fopen("c:\\hzk16","rb")==NULL)
{
printf("\nerror on open c:\\hzk16 file!");
getch();
exit(1);
}
这段程序的意义是,如果返回的指针为空,表示不能打开C盘根目录下的hzk16文件,则给出提示信息“error on open c:\ hzk16 file!” , 下一行getch()的功能是从键盘输入一个字符 , 但不在屏幕上显示 。在这里,该行的作用是等待 , 只有当用户从键盘敲任一键时,程序才继续执行,因此用户可利用这个等待时间阅读出错提示 。敲键后执行exit(1)退出程序 。
7) 把一个文本文件读入内存时,要将ASCII码转换成二进制码,而把文件以文本方式写入磁盘时 , 也要把二进制码转换成ASCII码,因此文本文件的读写要花费较多的转换时间 。对二进制文件的读写不存在这种转换 。
8) 标准输入文件(键盘),标准输出文件(显示器),标准出错输出(出错信息)是由系统打开的,可直接使用 。
13.3.2 文件关闭函数(fclose函数)
文件一旦使用完毕,应用关闭文件函数把文件关闭,以避免文件的数据丢失等错误 。
fclose函数调用的一般形式是:
fclose(文件指针);
例如:
fclose(fp);
正常完成关闭文件操作时,fclose函数返回值为0 。如返回非零值则表示有错误发生 。
13.4 文件的读写
对文件的读和写是最常用的文件操作 。在C语言中提供了多种文件读写的函数:
·字符读写函数 :fgetc和fputc
·字符串读写函数:fgets和fputs
·数据块读写函数:freed和fwrite
·格式化读写函数:fscanf和fprinf
下面分别予以介绍 。使用以上函数都要求包含头文件stdio.h 。
13.4.1 字符读写函数fgetc和fputc
字符读写函数是以字符(字节)为单位的读写函数 。每次可从文件读出或向文件写入一个字符 。
1. 读字符函数fgetc
fgetc函数的功能是从指定的文件中读一个字符 , 函数调用的形式为:
字符变量=fgetc(文件指针);
例如:
ch=fgetc(fp);
其意义是从打开的文件fp中读取一个字符并送入ch中 。
对于fgetc函数的使用有以下几点说明:
1) 在fgetc函数调用中,读取的文件必须是以读或读写方式打开的 。
2) 读取字符的结果也可以不向字符变量赋值 ,
例如:
fgetc(fp);
但是读出的字符不能保存 。
3) 在文件内部有一个位置指针 。用来指向文件的当前读写字节 。在文件打开时 , 该指针总是指向文件的第一个字节 。使用fgetc 函数后 , 该位置指针将向后移动一个字节 。因此可连续多次使用fgetc函数,读取多个字符 。应注意文件指针和文件内部的位置指针不是一回事 。文件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值,文件指针的值是不变的 。文件内部的位置指针用以指示文件内部的当前读写位置,每读写一次 , 该指针均向后移动 , 它不需在程序中定义说明 , 而是由系统自动设置的 。
【例13.1】读入文件c1.doc , 在屏幕上输出 。
#includestdio.h
main()
{
FILE *fp;
char ch;
if((fp=fopen("d:\\jrzh\\example\\c1.txt","rt"))==NULL)
{
printf("\nCannot open file strike any key exit!");
getch();
exit(1);
}
ch=fgetc(fp);
while(ch!=EOF)
{
putchar(ch);
ch=fgetc(fp);
}
fclose(fp);
}
本例程序的功能是从文件中逐个读取字符,在屏幕上显示 。程序定义了文件指针fp,以读文本文件方式打开文件“d:\\jrzh\\example\\ex1_1.c”,并使fp指向该文件 。如打开文件出错,给出提示并退出程序 。程序第12行先读出一个字符,然后进入循环,只要读出的字符不是文件结束标志(每个文件末有一结束标志EOF)就把该字符显示在屏幕上,再读入下一字符 。每读一次,文件内部的位置指针向后移动一个字符,文件结束时 , 该指针指向EOF 。执行本程序将显示整个文件 。
2. 写字符函数fputc
fputc函数的功能是把一个字符写入指定的文件中,函数调用的形式为:
fputc(字符量,文件指针);
其中,待写入的字符量可以是字符常量或变量,例如:
fputc('a',fp);
其意义是把字符a写入fp所指向的文件中 。
对于fputc函数的使用也要说明几点:
1) 被写入的文件可以用写、读写、追加方式打开,用写或读写方式打开一个已存在的文件时将清除原有的文件内容 , 写入字符从文件首开始 。如需保留原有文件内容,希望写入的字符以文件末开始存放,必须以追加方式打开文件 。被写入的文件若不存在,则创建该文件 。
2) 每写入一个字符,文件内部位置指针向后移动一个字节 。
3) fputc函数有一个返回值,如写入成功则返回写入的字符,否则返回一个EOF 。可用此来判断写入是否成功 。
【例13.2】从键盘输入一行字符,写入一个文件,再把该文件内容读出显示在屏幕上 。
#includestdio.h
main()
{
FILE *fp;
char ch;
if((fp=fopen("d:\\jrzh\\example\\string","wt "))==NULL)
{
printf("Cannot open file strike any key exit!");
getch();
exit(1);
}
printf("input a string:\n");
ch=getchar();
while (ch!='\n')
{
fputc(ch,fp);
ch=getchar();
}
rewind(fp);
ch=fgetc(fp);
while(ch!=EOF)
{
putchar(ch);
ch=fgetc(fp);
}
printf("\n");
fclose(fp);
}
程序中第6行以读写文本文件方式打开文件string 。程序第13行从键盘读入一个字符后进入循环,当读入字符不为回车符时,则把该字符写入文件之中,然后继续从键盘读入下一字符 。每输入一个字符,文件内部位置指针向后移动一个字节 。写入完毕 , 该指针已指向文件末 。如要把文件从头读出,须把指针移向文件头,程序第19行rewind函数用于把fp所指文件的内部位置指针移到文件头 。第20至25行用于读出文件中的一行内容 。
【例13.3】把命令行参数中的前一个文件名标识的文件,复制到后一个文件名标识的文件中,如命令行中只有一个文件名则把该文件写到标准输出文件(显示器)中 。
#includestdio.h
main(int argc,char *argv[])
{
FILE *fp1,*fp2;
char ch;
if(argc==1)
{
printf("have not enter file name strike any key exit");
getch();
exit(0);
}
if((fp1=fopen(argv[1],"rt"))==NULL)
{
printf("Cannot open %s\n",argv[1]);
getch();
exit(1);
}
if(argc==2) fp2=stdout;
else if((fp2=fopen(argv[2],"wt "))==NULL)
{
printf("Cannot open %s\n",argv[1]);
getch();
exit(1);
}
while((ch=fgetc(fp1))!=EOF)
fputc(ch,fp2);
fclose(fp1);
fclose(fp2);
}
本程序为带参的main函数 。程序中定义了两个文件指针fp1和fp2,分别指向命令行参数中给出的文件 。如命令行参数中没有给出文件名,则给出提示信息 。程序第18行表示如果只给出一个文件名,则使fp2指向标准输出文件(即显示器) 。程序第25行至28行用循环语句逐个读出文件1中的字符再送到文件2中 。再次运行时 , 给出了一个文件名,故输出给标准输出文件stdout , 即在显示器上显示文件内容 。第三次运行,给出了二个文件名 , 因此把string中的内容读出,写入到OK之中 。可用DOS命令type显示OK的内容 。
13.4.2 字符串读写函数fgets和fputs
1. 读字符串函数fgets
函数的功能是从指定的文件中读一个字符串到字符数组中 , 函数调用的形式为:
fgets(字符数组名,n,文件指针);
其中的n是一个正整数 。表示从文件中读出的字符串不超过 n-1个字符 。在读入的最后一个字符后加上串结束标志'\0' 。
例如:
fgets(str,n,fp);
的意义是从fp所指的文件中读出n-1个字符送入字符数组str中 。
【例13.4】从string文件中读入一个含10个字符的字符串 。
#includestdio.h
main()
{
FILE *fp;
char str[11];
if((fp=fopen("d:\\jrzh\\example\\string","rt"))==NULL)
{
printf("\nCannot open file strike any key exit!");
getch();
exit(1);
}
fgets(str,11,fp);
printf("\n%s\n",str);
fclose(fp);
}
本例定义了一个字符数组str共11个字节 , 在以读文本文件方式打开文件string后,从中读出10个字符送入str数组,在数组最后一个单元内将加上'\0' , 然后在屏幕上显示输出str数组 。输出的十个字符正是例13.1程序的前十个字符 。
对fgets函数有两点说明:
1) 在读出n-1个字符之前,如遇到了换行符或EOF,则读出结束 。
2) fgets函数也有返回值 , 其返回值是字符数组的首地址 。
2. 写字符串函数fputs
fputs函数的功能是向指定的文件写入一个字符串,其调用形式为:
fputs(字符串,文件指针);
其中字符串可以是字符串常量,也可以是字符数组名 , 或指针变量 , 例如:
fputs(“abcd“,fp);
其意义是把字符串“abcd”写入fp所指的文件之中 。
【例13.5】在例13.2中建立的文件string中追加一个字符串 。
#includestdio.h
main()
{
FILE *fp;
char ch,st[20];
if((fp=fopen("string","at "))==NULL)
{
printf("Cannot open file strike any key exit!");
getch();
exit(1);
}
printf("input a string:\n");
scanf("%s",st);
fputs(st,fp);
rewind(fp);
ch=fgetc(fp);
while(ch!=EOF)
{
putchar(ch);
ch=fgetc(fp);
}
printf("\n");
fclose(fp);
}
本例要求在string文件末加写字符串,因此,在程序第6行以追加读写文本文件的方式打开文件string 。然后输入字符串,并用fputs函数把该串写入文件string 。在程序15行用rewind函数把文件内部位置指针移到文件首 。再进入循环逐个显示当前文件中的全部内容 。
13.4.3 数据块读写函数fread和fwtrite
C语言还提供了用于整块数据的读写函数 。可用来读写一组数据,如一个数组元素,一个结构变量的值等 。
读数据块函数调用的一般形式为:
fread(buffer,size,count,fp);
写数据块函数调用的一般形式为:
fwrite(buffer,size,count,fp);
其中:
buffer 是一个指针,在fread函数中,它表示存放输入数据的首地址 。在fwrite函数中,它表示存放输出数据的首地址 。
size 表示数据块的字节数 。
count 表示要读写的数据块块数 。
fp 表示文件指针 。
例如:
fread(fa,4,5,fp);
其意义是从fp所指的文件中 , 每次读4个字节(一个实数)送入实数组fa中 , 连续读5次,即读5个实数到fa中 。
【例13.6】从键盘输入两个学生数据,写入一个文件中,再读出这两个学生的数据显示在屏幕上 。
#includestdio.h
struct stu
{
char name[10];
int num;
int age;
char addr[15];
}boya[2],boyb[2],*pp,*qq;
main()
{
FILE *fp;
char ch;
int i;
pp=boya;
qq=boyb;
if((fp=fopen("d:\\jrzh\\example\\stu_list","wb "))==NULL)
{
printf("Cannot open file strike any key exit!");
getch();
exit(1);
}
printf("\ninput data\n");
for(i=0;i2;i,pp)
scanf("%s%d%d%s",pp-name,pp-num,pp-age,pp-addr);
pp=boya;
fwrite(pp,sizeof(struct stu),2,fp);
rewind(fp);
fread(qq,sizeof(struct stu),2,fp);
printf("\n\nname\tnumber age addr\n");
for(i=0;i2;i,qq)
printf("%s\t]} %s\n",qq-name,qq-num,qq-age,qq-addr);
fclose(fp);
}
本例程序定义了一个结构stu,说明了两个结构数组boya和boyb以及两个结构指针变量pp和qq 。pp指向boya,qq指向boyb 。程序第16行以读写方式打开二进制文件“stu_list”,输入二个学生数据之后,写入该文件中,然后把文件内部位置指针移到文件首,读出两块学生数据后,在屏幕上显示 。
------
回复此文章 |
回复主题:Re:c语言文件操作 | 作者: haohao | 军衔:六级军士 | 发表时间:2004-07-28 11:08:47
下午应该把这个搞定了.
------
回复此文章 |
回复主题:Re:Re:c语言文件操作 | 作者: haohao | 军衔:六级军士 | 发表时间:2004-07-28 11:10:23
13.7 C库文件
C系统提供了丰富的系统文件,称为库文件,C的库文件分为两类,一类是扩展名为".h"的文件,称为头文件,在前面的包含命令中我们已多次使用过 。在".h"文件中包含了常量定义、类型定义、宏定义、函数原型以及各种编译选择设置等信息 。另一类是函数库,包括了各种函数的目标代码,供用户在程序中调用 。通常在程序中调用一个库函数时 , 要在调用之前包含该函数原型所在的".h" 文件 。
下面给出Turbo C的全部".h"文件 。
Turbo C头文件
n ALLOC.H 说明内存管理函数(分配、释放等) 。
n ASSERT.H 定义 assert调试宏 。
n BIOS.H 说明调用IBM—PC ROM BIOS子程序的各个函数 。
n CONIO.H 说明调用DOS控制台I/O子程序的各个函数 。
n CTYPE.H 包含有关字符分类及转换的名类信息(如 isalpha和toascii等) 。
n DIR.H 包含有关目录和路径的结构、宏定义和函数 。
n DOS.H 定义和说明MSDOS和8086调用的一些常量和函数 。
n ERRON.H 定义错误代码的助记符 。
n FCNTL.H 定义在与open库子程序连接时的符号常量 。
n FLOAT.H 包含有关浮点运算的一些参数和函数 。
n GRAPHICS.H 说明有关图形功能的各个函数,图形错误代码的常量定义,正对不同驱动程序的各种颜色值,及函数用到的一些特殊结构 。
n IO.H 包含低级I/O子程序的结构和说明 。
n LIMIT.H 包含各环境参数、编译时间限制、数的范围等信息 。
n MATH.H 说明数学运算函数,还定了 HUGE VAL 宏 , 说明了matherr和matherr子程序用到的特殊结构 。
n MEM.H 说明一些内存操作函数(其中大多数也在STRING.H中说明) 。
n PROCESS.H 说明进程管理的各个函数,spawn…和EXEC …函数的结构说明 。
n SETJMP.H 定义longjmp和setjmp函数用到的jmp buf类型,说明这两个函数 。
n SHARE.H 定义文件共享函数的参数 。
n SIGNAL.H 定义SIG[ZZ(Z] [ZZ)]IGN和SIG[ZZ(Z] [ZZ)]DFL常量,说明rajse和signal两个函数 。
n STDARG.H 定义读函数参数表的宏 。(如vprintf,vscarf函数) 。
n STDDEF.H 定义一些公共数据类型和宏 。
n STDIO.H 定义Kernighan和Ritchie在Unix System V 中定义的标准和扩展的类型和宏 。还定义标准I/O 预定义流:stdin,stdout和stderr , 说明 I/O流子程序 。
n STDLIB.H 说明一些常用的子程序:转换子程序、搜索/ 排序子程序等 。
n STRING.H 说明一些串操作和内存操作函数 。
n SYS\STAT.H 定义在打开和创建文件时用到的一些符号常量 。
n SYS\TYPES.H 说明ftime函数和timeb结构 。
n SYS\TIME.H 定义时间的类型time[ZZ(Z] [ZZ)]t 。
n TIME.H 定义时间转换子程序asctime、localtime和gmtime的结构 , ctime、 difftime、 gmtime、 localtime和stime用到的类型,并提供这些函数的原型 。
n VALUE.H 定义一些重要常量,包括依赖于机器硬件的和为与Unix System V相兼容而说明的一些常量,包括浮点和双精度值的范围 。
13.8 本章小结
1. C系统把文件当作一个“流” , 按字节进行处理 。
2. C文件按编码方式分为二进制文件和ASCII文件 。
3. C语言中,用文件指针标识文件,当一个文件被打开时 , 可取得该文件指针 。
4. 文件在读写之前必须打开,读写结束必须关闭 。
5. 文件可按只读、只写、读写、追加四种操作方式打开,同时还必须指定文件的类型是二进制文件还是文本文件 。
6. 文件可按字节,字符串 , 数据块为单位读写,文件也可按指定的格式进行读写 。
7. 文件内部的位置指针可指示当前的读写位置,移动该指针可以对文件实现随机读写 。
C语言库函数假定你是在linux下做这件事 (在windows下应该也是类似的)
假定你要产生的库名字为 libtest.a
1. 实现库函数于 test.c
#include stdio.h
int test()
{
printf("hello world!\n");
return 0;
}
test.h内容:
extern int test();
2. 编译test.c并产生库文件
gcc -c test.c
ar -r libtest.a test.o
3. 其他程序如何调用 libtest.a 里的 test()函数?
main.c
#include "test.h"
int main()
{
return test();
}
4. 编译main.c产生可执行文件
gcc -o main.out main.c -L/path/to/libtest -ltest
5. 运行 main.out
./main.out
PS, 头文件的用处无非就是提供函数原型声明 , 在我上面给的例子中,可以把 test.h 删除 , 但是必须在 main.c 里自己加上 extern int test(); 来声明函数 。
c语言中的库函数是如何使用的,最好有例子其实在C语言编程中,我们所用的在部分函数就是C语言库本身带的函数,在使用某一个库文件之前,我们先要包含库文件所对应的头文件,再在我们需要的地方调用库函数就行了.最常用的printf();这就是一个库函数,这个库函数在头文件stdio.h中声明.所以使用前要先#include stdio.h
举个例子:
#include stdio.h//一定要先包含库函数声明的文件
int main()
{
printf("for example!\n");//在此处调用库函数
}
如果想要了解更多的库函数,可以参考C语言的教材,一般的附录中会列出.也可以查看C库函数.
C语言常用的函数有哪些C语言库函数c语言库函数示例 , 常用库函数有:
1、scanf格式输入函数
2、printf格式输出函数
3、systemdos命令函数
4、sort排序
5、main主函数
6、fgets文件读取字符串函数
7、fputs文件写入字符串函数
8、fscanf文件格式读取函数
9、fprintf文件格式写入函数
10、fopen打开文件函数
11、getchar输入字符函数
12、putchar输出字符函数
13、malloc动态申请内存函数
14、free释放内存函数
15、abs求绝对值数学函数
16、sqrt求平方根数学函数
扩展资料
语言组成:
1、数据类型
C的数据类型包括:整型、字符型、实型或浮点型(单精度和双精度)、枚举类型、数组类型、结构体类型、共用体类型、指针类型和空类型 。
2、常量与变量
常量其值不可改变c语言库函数示例,符号常量名通常用大写 。
变量是以某标识符为名字c语言库函数示例,其值可以改变的量 。标识符是以字母或下划线开头的一串由字母、数字或下划线构成的序列,请注意第一个字符必须为字母或下划线,否则为不合法的变量名 。变量在编译时为其分配相应存储单元 。
3、数组
如果一个变量名后面跟着一个有数字的中括号,这个声明就是数组声明 。字符串也是一种数组 。它们以ASCII的NULL作为数组的结束 。要特别注意的是,方括内的索引值是从0算起的 。
4、指针
如果一个变量声明时在前面使用 * 号,表明这是个指针型变量 。换句话说,该变量存储一个地址,而 *(此处特指单目运算符 * ,下同 。C语言中另有 双目运算符 *) 则是取内容操作符,意思是取这个内存地址里存储的内容 。指针是 C 语言区别于其c语言库函数示例他同时代高级语言的主要特征之一 。
参考资料来源:百度百科-函数
【c语言库函数示例 c语言库函数的使用方法】c语言库函数示例的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c语言库函数的使用方法、c语言库函数示例的信息别忘了在本站进行查找喔 。
推荐阅读
- 手机直播软件加速器,直播加速插件
- 电商产品如何定义价值,电商产品如何定义价值呢
- chatgpt国内手机号,国际长途手机号码中国
- 国外室内学生毕业设计网站,国外设计学院毕业展
- mysql的密码怎么查看 怎么查看mysql的密码忘了
- 油管视频是什么,油管为什么中国被禁用
- 可爱好玩的三丽鸥养成游戏,三丽鸥的游戏大全
- flutter序列化list,flutter listtile
- oracle怎么导数据 oracle如何导入导出数据