.precision:
至少输出位数。
若实际的位数xprecision,按实际输出,否者左边补零
(2)无符号int
%[-][#][0][width][.precision][l][h]u|o|x|X
#:
"%o%x/X〃输出0』x,0X
.precision:
同上,TC/BC包含0x/XM下不包含
(3)实数输出
%卜]田[#][0][width][.precision][I][L]f|e|E|g|G
#:
必须输出小数点
•precision:
小数位数(四舍五入)
(4)字符和字符串的输出
%[-][0][width]c%[-][0][width][.precision]s
.precision:
S的前precision位
2,scanf
%[*][width][l][h]Type
With:
指定输入数据的宽度,遇空格、Tab、\n结束
*:
抑制符scanf("%2d%*2d%3d〃,&numb&num2)输入123456789\n;numl==12/num2==567.
注意:
(1)指定width时,读取相应width位,但按需赋值
Scanf(“%3c%3c”,&chl,&ch2)输入abcdefgchl==ach2==d
(2)%c输入单字符时“空格、转义字符”均是有效字符
(二)asdl字符/字符串/文件函数
1;字符非格式化输入函数
(1)intgetchar(void)接受字符,以回车结束,回显
(2)intgetc(FILE*stream)从stream中接受字符,以回车结束,回显stream=stdin时,
(1)==
(2)
(4)intgetchar(void)直接读取字符,不回显conio.h
注意:
(1,2)对于回车键返回'\r/(3,4)对于回车键返回'\r,
2;字符/串非格式化输出函数
stream==stdout(l)=
(2)
(2)intputc(intc,FILE*stream)正常返回字符代码值,出错返回EOF
(3)intputs(char*stream)自动回车换行
1;字符串的赋值
#include
Void*memset(void*s,charch,unsignedn)
将以S为首地址的,一片连续的N个字节内存单元赋值为CH.
Void*memcpy(void*d,void*s,unsignedn)
将以s为首地址的一片连续的N个字节内存单元的值拷贝到以D为首地址的一片连续的内存单元中。
(对于数据类型、大小相同的数组可以用此函数拷贝/部分拷贝)
2;#include
(1)strlen(求字符串长度)
求字符串长度,从给定的字符串的起始地址开始,到第一个'\o,为止(不包含'\o,)。
转义字符\ddd、\xhh;看做一个字符。
(2)字符串的复制
Strcpy(字符数组1,字符串2);
将字符串2,复制到字符数组1中(包含\0);1要足够大。
1:
必须为字符数组变量2字符数组变量或字符串常量
strncpy(字符数组1,字符串2,长度n)
将2中的前N个字符复制到1中,并在末尾加\0;
n>=strlen
(2)时,其等价strcpyo
(4)字符串的比较
1>2返回正数
1=2返回0
1<2返回负数
比较规则:
逐个比较字符的ASCII码值,直到遇到不同的字符或A0\
Strcinp(字符串If字符串2)
Stricmp/Strcmpi(字符串1,字符串2)"不区分大小写"
Strncmpf字符串1,字符串2,长度n)
将字符串1前N个字符与字符串2前N个字符进行比较(n足够大时等价strcmp)
Strincmpf字符串1,字符串2,长度n)
⑸字符串的连接
Strcat(字符串1,字符串2)
将2连接到1后面(包含\0)江要足够大。
Strncat(字符串1,字符串2,unsignedintcount)
将2的前N个字符连接到1后面以\0结束;
3;动态分配内存include
(i)void*calloc(unsignedn,unsignedsize);
功能:
在内存的动态存储区中分配n个长度为size的连续空间,并且赋初值为0(malloc侧不是);函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。
⑵原型:
externvoid*realloc(void*mem_address/unsignedintnewsize)
语法:
指针名二(数据类型*)realloc(要改变内存人小的指针名,新的人小)。
//新的人小一定要人于原來的人小不然的话会导致数据丢失!
头文件:
//include有些编译器需要^include,在TC2.0中可以使用alloc.h头文件
功能:
先按照newsize指定的人小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem.address所指内存区域,同时返回新分配的内存区域的首地址。
即重新分配存储器块的地址。
返回值:
如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
注意:
这里原始内存屮的数据还是保持不变的。
当内存不再使用吋,应使用free()函数将内存块释放。
(三)文件函数
mode:
r:
打开已存在文件,准备从文件中读取数据,不能写入
r+:
可读可写
w:
创建一个新文件,准备写入;如文件已存在,此文件将被空文件覆盖w+:
增加“读取”操作
a:
打开已存在文件,准备在文件尾部追加数据,不能读取。
如文件不存在,侧创建此文件,准备写入。
a+:
增加“读取”
t:
打开一个文本文件(缺省值)
b:
打开一个二进制文件
一:
文件的打开与关闭
1:
打开文件
FILE*fopen(char^filename,char*mode)
Filename:
是字符串,表示打开的文件名,文件名前可以带路径。
Mode:
也是字符串,表示打开文件的方式。
功能----按指定方式打开文件。
返回值一一如果文件打开成功,返回“文件结构体指针”,否者返回NULL(如:
文件不存在或则写文件时不能创建)。
Fopen("A:
\\user\\asd.txtvfr+〃);
2:
关闭文件
Int*fclose(FILE*filename)
正常关闭返回0;否者返回非0。
3:
Intfeof(FILE*f订epointer)
功能--在执行文件操作时,遇到文件尾,返回1;否则返回0;
Eg.!
feof(fpl)表示源文件(用于输入)未结束,循环继续。
此函数适用于ASCII码文件盒二进制文件。
EOF是文本文件结束的标志。
在文本文件中,数据是以字符的ASCII代码值的形式存放,普通字符的ASCII代码的范围是32到127(十进制),EOF的16进制代码为OxlA(十进制为26),因此可以用EOF作为文件结束标志。
当把数据以一进制形式存放到文件屮时,就会有4值的出现,因此不能采用EOF作为二进制文件的结束标志。
为解决这一个问题,ASCIC提供一个feof函数,用來判断文件是否结束。
feof函数既可用以判断二进制文件乂可用以判断文本文件。
“C〃语言的“feof()〃函数和数据库中“eof()〃函数的运作是完全不同的。
数据库中〃eof()〃函数读取当前指针的位置,语言的“feof()〃函数返回的是最后一次〃读操作的内容〃。
多年来把"位置和内容〃相混,从而造成了对这一概念的似是而非。
那么,位直和内容到底有何不同呢?
举个简单的例子,比如有人说“你走到火车的最后一节车箱〃这就是位置。
而如果说“请你一直向后走,摸到铁轨结束〃这就是内容。
也就是说用内容来判断会“多走一节〃。
这就是完全依赖于“while(血of(FP)){.・・}〃进行文件复制时,日标文档总会比源文档“多出一些〃的原因。
二:
文件的读写
1:
字符读写函数fgetc和fputc
(1):
intfgetc(FILE*filepointer)
功能从文件指针f订epointer指向的文件中,读入一个'字节(字符),,同吋将读写位置
指针向前移动一个字节。
返回值——如果读取正常,返回读到的的字节值;如果读到文件尾或出错;侧返回EOF。
fgetc函数返回的值是int类型,如果强制的赋值给char类型,会导致当读出的数据为Oxff时,误认为是EOF(-),导致程序出错。
⑵:
Intfputc(intc,FILE*filepointer)
动一个字节。
返回值・成功、返回字符数据c;否者返回EOF。
2:
字符串读写函数fgets和fputs
⑴:
Char*fgets(char*s,intn,FILE*filrpointer)
Cahr^s可以是“字符数组名,,也可是“字符串”(别的类似的函数也是如此)
功能从文件指针f订epointer指向的文件中,读取长度最大为n-l的字节串,并在字符串的
末尾加上结束标志然后将字符串放在s中,同时读写位置指针向前移动,实际读写的字串长度«=n-l)个字节。
“当从文件中读取第n-1个字符后或读取数据过程中遇到”\n,(“\n也会存入字符串”)后,函数返回/一次s中存放的字符串的长度不一定正好是'n-ro
返回值----如成功,返回读取字串的指针;如果读到文尾或出错,返回NULL。
(2):
Intfputs(charts,FILE*filepointer)
功能-一将存放在S中的字串,写到文件指针Clepointer指向的文件中,同时将读写位置指针
向前移动,字符串长度个字节。
“注意:
fputs函数不会将字符串结尾符'\0,写入文件,也不会自动向文件写入自动换行符,如需写入一行文本,S字串中必须包含
返回值一一成功,返回“最后写入文件的字符”;否则返回EOF。
3:
数据块读取函数fread和fwrite
(1):
Unsignedfread(void*ptr,unsignedsize,unsignedn,FILE*filepointer)
功能从filepointer所指向的的文件中读取n个数据项,每个数据项的大小事size个字节,
并把这些数据存入ptr所指的内存中。
且位置指针向前移动n*size个字节,如
sizeof(int)。
返回值操作成功,返回读取数据项的个数(不是字节的个数);出错或到文尾,返回0。
(2)
Unsignedfwrite(void*ptr‘unsignedsize,unsignedn,FILE*filepointer)
功能一■将ptr所指向的的内存中存放的n个大小为size的数据项写入Clepointer所指向的文件中,实际要写入数据项的字节数是n*size。
同时,将读写位置指针向前移动n*size个字节。
返回值一T操作成功,返回:
实际写入的数据项的个数;岀错,返回0
注意:
―fread和fwrite—般用于二进制文件的输入和输出。
如强制输入输出到文本文件,即使打开文件也是乱码或与内容不符。
4:
格式化读写函数fscanf和fprintf
此两函数和scanf和printf函数的区别是:
fcanf/fprintf的操作对象是“指定文件”;而scanf/printf函数的操作对象是“stdin和stdout"
(1):
Intfscanf(FILE^filepointer,constchar*format[,address,…;
功能一T从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。
这与fgets有区别,fgets遇到空格不结束。
///*fscanf遇到\t会跳过,遇到\n会结束.并让位置指针移到下行,所以此处的\t可以略去*/
返回值-一9如果操作成功,返回:
读取数据项的个数;如果出错或到文尾,返回:
EOFoFscanf(fp,“%d,%f”,&I,&t)//若文件中有3,4.5,侧将3送入I,4.5送入t。
fprintf(fp,u%d,%6.2f”,I,t)//将i和t按%小%6.2f格式输出到fp文件。
“%d,%f”中间的“,”可以不写生成的文件中数据相隔两个“空格”。
⑵:
Intfprintf(FILE*filepointer,constchar^formataddress,•••]);
功能函数根据指定的format(格式)(格式)发送信息(参数)到由stream(流)指定的文件.
fprintf()只能和printf()—样工作.
返回值成功,返回:
写入到文件中数据的字节个数;否则返回EOF(-1)
注意:
文件格式化输出函数fprintf总是以字符串的形式将数据信息存到文件中,而不是以数值的形式存放到文件中,不管打开的是文本文件还是二进制文件。
Fgets/fputc:
可对“b/t"文件读写;
Fread/fwrite:
可对“b/t"文件读写
Fgets/fputs:
主要对“t”读写;对“b”读写无意义
Fscanf/fprintf:
同上
三:
文件的定位读写
(1):
rewind函数
Voidrewind(FILE*filepointer);
功能一T将f订epointer所指向的文件的位置指针从新置回到文件的开头。
返回值3无
(2):
fseek函数
Intfseek(FILE*f订epointer,longoffset,intwhence)
功能—将filepointer所指向的文件的位置指针移动到特定的位置。
这个特定的位置由whence
和offset决定,即将位置指针移动到距离whence的offset字节处。
(Whence的值如下表)如果offset为正值,表明新的位置在whence的后面;如果是负值,表明新的位置在whence的前面。
返回值-一T操作成功返回0;否则返回非0/-E(只对小于4G的文件有效)
注着••fseek函数一般用于二进制文件,在文本文件中由于要进行转换,故往往计算的位置有误。
Whence的常量值
数值
含义
SEEK_SET
0
文件的开始处
SEEK_CUR
1
文件位置指针的当前位置
SEEK_END
2
文件的末尾
fseek函数的文件指针,应该为己经打开的文件。
如果没有打开的文件,那么将会出现错误。
fseek函数也可以这样理解,相当于在文件当中定位。
这样在读取规律性在储文件时可以利用其OFFSET偏移量读取文件上任意的内容。
fseek函数一般用于二进制文件,也可以用于文本文件。
用于文木文件操作时,需特别注意回车换行的情况:
因为在一般浏览工具如UltraEdit中,回车换行视为两个字符OxOD和OxOA,但真实的文件读写和定位时确按照一个字符OxOA进行处理,因此碰到此类问题时,可以考虑将文件整个读入内存,然后在内存中手工插入OxOD的方法,这样可以达到较好的处理效果。
当offset是向文件尾方向偏移的时候,无论偏移量是否超出文件尾,fseek都是返回0,当偏移量没有超出文件尾的时候,文件指针式指向正常的偏移地址的,当偏移量超川文件尾的时候,文件指针是指向文件尾的。
并不会返回偏移出错值。
offset>(当前位置指针到文尾的偏移时)使位置指针至尾的,不能写入内容,否则文件结尾符将被覆盖,文件变大/文件损坏将无法打开!
当offset是向文件头方向偏移的时候,如果offset没有超出文件头,是正常偏移,文件指针指向正确的偏移地址,fseek返回值为0.当offset超出文件头时,fseek返回出错4值,文件指针不变还是处于原来的地址。
(3):
ftell函数
Longftell(FILE*filepointer)
文件位置指针的最小值是0,最大值是文件的长度。
功能一T返回filepointer所指向文件当前位置指针的值(用相对文件开头的位移量表示)。
返回值--―成功,返回:
当前位置指针的值;出错,返回:
-lLo
(三)文件夹函数
1、文件夹/文件的判断函数access
头文件:
io.h
功能:
确定文件或文件夹的访问权限。
即,检查某个文件的存取方式,比如说是只读方式、只写方式等。
如
果指定的存取方式有效,则函数返回0,否则函数返回-1。
用法:
intaccess(constchar*filenpath,intmode);或者int_access(constchar*path,intmode);
备注:
(filenpath)当该参数为文件的时候,access函数能使用mode参数所有的值,当该参数为文件夹的时候,access函数值能判断文件夹是否存在。
在WINNT中,所有的文件夹都有读和写权限
Mode:
0(F_OK)只判断是否存在
2(R_OK)判断写入权限
4(W_OK)判断读取权限
6(X_OK)判断执行权限
若存在或者具存权限,返回值为0:
不存在或者无权限,返回值为-1。
特別提醉:
fopen用这种方法做出的判断是不完全正确的,因为有的文件存在,但是可能不可读。
错误代码
EACCESS参数pathname所指定的文件不符合所婆求测试的权限。
EROFS欲测试写入权限的文件存在于只读文件系统内。
EFAULT参数pathname指针超出可存取内存空间。
EINVAL参数mode不正确。
ENAMETOOLONG参数pathname太长。
ENOTDIR参数pathname为一目录。
ENOMEM核心内存不足
ELOOP参数pathname过多符号连接问题。
EIOI/O存取错i吴。
特别提醒:
使用accessf)作用户认证方面的判断要特别小心,例如在access()后再做open()的空文件可能会造成系统安全上的问题。
2.C语言创建目录、文件夹
1.调用WindowsAPI函数CreateDirectoryO:
CreateDirectory("D:
\\MyDir"zNULL);
2.调用C运行库函数mkdir():
#include
mkdir("D:
\\l\/lyDirH);
VS/TC中可用
VC++6.0用法:
int_mkdir(constchar*dirname);
头文件库:
direct.h
返回值:
创建-个目录,若成功则返回0,否则返回J
3.调用system命令md:
system("mdD:
\\MyDiru);
4.打开文件夹
system(uexplorer.exeF:
\\loul");/system(”explorerF:
\\louln);
3.判断文件大小
unsignedlonggetfilesize(char*str)
{
structstatf_stat;
if(stat(str,&f_stat)二二・1)
{
return-1;
}
return(unsignedlong)f_stat.st_size;/*返回的文件里的字符数(B),缺点是最多只能表示人约4G的文件,因返回值是unsignedlong*/
(四)structstat作用
stat,Istat,fstatl函数都是获取文件(普通文件,目录,管道,socket,字符,块()的属性。
函数原型include
intstat(constchar*restrictpathname,structstat*restrictbuf);提供文件名字,获取文件对应属性。
intfstat(intfiledes,structstat*buf);通过文件描述符获取文件对应的属性。
intlstat(constchar*restrictpathname,structstat*restrictbuf);连接文件描述命,获取文件属性。
2文件对应的
属性
structstat{
modestst_mode;//文件对应的模式,文件,目录等
ino_tst」no;//inode节点号
dev_tst_dev;〃设备号码
dev_tst_rdev;//特殊设备号码
nlink_tst_nlink;//文件的连接数
uid_tst_uid;//文件所有者
gid_tst_gid;//文件所有者对应的组
off_tst_size;//普通文件,对应的文件字节数
time_tst_atime;//文件最后被访问的时间
time_tst_mtime;//文件内容最后被修改的时间
time_tst_ctime;//文件状态改变时间
blksize_tst_blksize;//文件内容对应的块大小
blkcnt_tst_blocks;//伟建内容对应的块数量
time_tst_atime;/*timeoflastaccess■最近存取时间*/
time_tst_mtime;/*timeoflastmodification■最近修改时间*/
time_tst_ctime;/*timeoflaststatuschange-*/
};
#includevunsitd・h>
#inlcude
#include
intfstat(intfiledes,structstat*buf);
intstat(constchar*path,structstat*buf);
intlstat(constchar*path,structstat*buf);
这三个系统调用都可以返回指定文件的状态信息,这些信息被写到结构structstat的缓冲区中。
通过分析这个
结构可以获得指定文件的信息。
fstat区别于另外两个系统调用的地方在于,fstat系统调用接受的是一个〃文件描述符〃,而另外两个则直接接受〃文件全路径〃。
文件描述符是需要我们用open系统调用后才能得到的,而文件仝路经直接写就可以了。
stat和Istat的区别:
当文件是一个符号链接时,Istat返回的是该符号链接本身的信息;而stat返回的是该链接指向的文件的信息。
(似乎有些晕吧,这样记,Istat比stat多了一个I,因此它是有本事处理符号链接文件的,因此当遇到符号链接文件时,Istat当然不会放过。
而stat系统调用没有这个本事,它只能对符号链接文件睁一只眼闭一只眼,直接去处理链接所指文件喽)
voidreport(structstat*ptr)
{
printf