c语言基础教程-第十章------文件和读写函数
C语言基础教程文件和文件指针
1.文件
一般说来,文件是有序数据的集合。程序文件是程序代码的有序集合,数据文件是一组数据的有序集合。文件是被存放在外部存储设备中的信息。对文件的处理过程就是面向文件的输入和输出过程。文件的输入过程是从文件中读出信息,文件的输出过程是往文件中写入信息,文件的输入的过程使用读函数,实现文件输出的过程使用写函数。文件的读写函数是实现文件操作的主要函数,本章将用大量篇幅来讲述文件的读写函数。
C语言文件被称为流式文件,其特点是不分记录或块,将文件看成是信息"流"或看成是一个字符流(文本文件),或看成是一个二进制流(二进制文件).文件的存取是以字符(字节)为单位的,读写数据流的开始和结束受程序控制。任何一个文件都是以EOF结束,最简单的文件是只有结束符的空文件。
C语言文件包含有设备文件和磁盘文件,例如,键盘是一种输入信息的文件,显示器屏幕和打印机是输出信息的文件它们都属于设备文件。将内存的信息放到磁盘上保存,需要时再从磁盘上装入内存,这就要使用磁盘文件,磁盘文件是计算机中常用的文件n
C语言文件按存放设备分设备文件和磁盘文件;按数据的组织形式分为文本文件(ASCII码文件)和二进制文件。文本文件是按一个字节存放一个字符的ASCII码来存放的;二进制文件是按数据在内存中的存储形式放到磁盘上的。例如,有一个整数10000,在内存中按二进制形式存放,占2个字节,将它放在磁盘上如按文本文件形式存放,占5个字节,每个数位占一个字节。两种存放方式各有利弊。以文本文件形式输出便于对字符进行处理,也便于输出字符,但是占用存储空间较多,并且要花费转换时间。以二进制文件形式输出可节省存储空间和转换时间,但是不能直接输出字符形式。
2.文件指针
文件指针是一种用来指向某个文件的指针。如果说某个文件指针指向某个文件,则是该文件指针指向某个文件存放在内存中的缓冲区的首地址。
每一个被使用的文件都要在内存中开辟一个区域,用来存放的有关信息,包括文件名字、文件状态和文件当前位置等。这些信息被保存在一个结构变量中,该结构变量所对应结构模式被系统定义为F ILE,它被放在,stdio h文件中。有些版式的FILE被定义如下:
type struct
{
int fd; /*文件号*/
int cleft /*缓冲区内剩余的字符*、
int mode; /文件操作模式*/
char * mexic; /*下一个字符位置*/
char * huff; /*文件缓冲区位置*/
}FILE;
在文件操作的程序中,要使用FILE来定义文件指针,并且将打开的文件缓冲区的首地址赋给文件指针,让它指向该文件。例如
FILE:*FP;
其中,fp是一个指向文件的指针。
fp,fOpen〔"ahc.txr","r"):
给fp赋值,使它指向abc, txt文件。于是。fp便是一个指向abc.txt文件的指针。有了文件指针以后,对'文件的操作(读、写和关闭等)都使用文件指针,而不使用文件名。
3.读写
读写指针当一个文件被打开后用来标识读写文件位置的。它与文件指针是不同的。文件指针一旦被指向某个文件。它的值是不会改变的,直到该文件被关闭为止。而读写指针是当某个文件被打环时,它指向文件头或文件尾(与打开方式有关),可以通过定位函数(fseek()来改变读写指针的位置。可见,读写指针与文件指针是两个完全不同的概念,在使用时应注意分清。
关于指针的详细描述,在本章后面讲述文件定位函数时还会讲到。
C语言基础教程标准文件和一般文件
1.标准文件
C语言中规定的标准文件一有三个,它们分别是标准输入文件(键盘)、标准输出文件(显示屏幕)和标准出错信息文件,规定错误信息显示在屏幕上。这二个文件的文件指针分别为标准输入文件是stdin,标准输出文件是stdout,标准出错信息文件是stderr。
标准文件的特点是这类文件使用前不必打开,使用后不必关闭。因为系统将它在启动系统时自动打开。在退出系统时自动关闭,并且自动为这三个标准文件分配缓冲区,指定文件指针。因此,使用标准文件十分方便J这也是在前面所讲述的内容中没有涉及到文件打开和关闭操作的原因。到现在为止,所使用的读写函数(即输入输出函数)都是对标准文件的,而对于一般文件(即非标准文件)的操作在本章后面再讲述。
2.一般文件
般文件是指除了土述的标准文件以外的文件,包括设备文件和磁盘文件。
一般文件的特点是操作前需要先打开文件,操作后要及时关闭文件。打开文件和关闭文件由专门的函数实现这一操作。执行打开文件函数实现打开文件的操作就是在内存中建立1个fit放文件的缓冲区。如果打汗文件成功,则内存建立了一个缓冲区,这时打开文件函数将返回一个地址值。将它赋给一个定义的文件指针。让它指向该文件。如果打开文件失败'则内存中不建立缓冲区,这时打开文件函数返回NULL.一旦文件被打开后,便可以对该文件进行读或写操作,对于'一般文件来讲,打开文件是进行读写操作的前提。打开的文件操作完成后,要及时关闭文件,关闭文件由专门关闭文件函数来实现。及时关闭文件可以及时释放所占用的内存空间,还可以保证文件内容的安全。关闭文件是将文件从内存中清除,送回到磁盘中,因此,不要把关闭文件看成是删除文件。应该养成及时关闭不用文件的好习惯。
C语言基础教程高级读写函数和低级读写函数
UNIX系统下的c语言版本对文件的处理方法分成两种:一种叫"缓冲文件系统",另一种叫"非缓冲文件系统".缓冲文件系统是指系统在内存区域中自动地为打开的文件开辟一个缓冲区。对文件数据的读写都要经过缓冲区。具体操作是当从内存中输出数据时,先将数据送到内存缓冲区,装满缓冲区后一起送到磁盘;当从磁盘向内存装入数据时,则是从磁盘文件中一次将一批数据送到内存装满缓冲区,然后再从缓冲区逐个地将数据送到程序数据区,赋给程序变量。一般地,缓冲区大小为mz个字节。非缓冲区是指系统不为文件自动建立缓冲区,而是程序为每个文件设定缓冲区。
一般地认为,使用缓冲文件系统进行文件读写操作的称为高级读写函数,它与机器无关;使用非缓冲文件系统进行文件读写操作的称为低级读写函数,它与机器相关。早先规定用缓冲文件系统处理文本文件。用非缓冲文件系统处理二进制文件,后来将缓冲文件系统扩充为可以处理二进制文件。
本书着重讲解高级读写函数的使用,考虑到低级读写函数使用较少,本书将不再介绍,如果需要可阅读有关资料。
c语言中,设有输入输出语句,而对文件的读写操作的函数都是用库函数来提供的。
C语言基础教程标准文件读写函数介绍
在第一章中对标准文件的读写限数已经作了较为详细的讲述。这里,再作一些简单介绍和补充。
1.对一个字符的读写函数
读一个字符的函数getchar(),该函数用来从键盘缓冲区中每次读取一个字符,该函数的返回值为读取字符的ASCII码值。
写一个字符的函数purchar(),该函数有一个参数,其功能是将参数给出的字符输出到屏幕上。
2.对一个字符串的读写函数
读一个字符串函数gets().该函数返回一个宇符型指针,该函数有一个参数,该参数是用来存放读取的字符的。该函数的功能是从键盘上读取一个字符串存放到该函数参数所指定的字符数组中,返回指向该字符数组的指针。
写一个字符串函数puts(),该函数的功能是将其参数中所指定的字符串输出到显示屏幕上。该函数的参数是一个字符数组或字符指针,或字符串常量。
3.具有指定格式的读写函数
这里再补充介绍标准格式输入函数scanf()和标准格式输出函数printf()的一些内容。
(1)标准格式输入函数scanf()
该函数格式如下:
scant("{控制串),(参数表)")
该函数有关参数说明在第一章中已经讲述过了。下面仅作两点补充。
一是在(控制串)中除了格式符外,还可用除空格符以外的一般字符,一般字符作为匹配符。所谓匹配符是用来确定输入数据流中愉入项的。在控制串中使用一般字符作为匹配符时。输入数据流中要有与匹配符对应的字符来区分数据流中的输入项。例如,控制串中出现匹配符逗号(,),则在输入流中要以逗号来分隔输入项,要求控制串中出现的匹配符要与输入流中出现的分隔符一致,即字符相同,次数相等。
C语言中用来区分输入流的数据输入项的方法有三;一是前面讲述的用匹配符的办法;二是在格式符中加最大域宽的修饰符;三是使用默认的输入项分隔符-空白符,这时控制串中不加任何其他字符。
二是在控制串中,格式符里%与格式说明符之间可以加如下修饰符:
(1)数字。用来表示最大的域宽。如果输入流中数据位数超过最大域宽,则只取最大域宽的位数,其后舍去;如果输入流数据位数不足最大域宽,则按实际宽度读取。
(2)!字符,!字符用在表示int型数的格式符d.o,x前面,表示长整型;用在格式符f前面表示双精度浮点数。
(3)h字符。h字符只可用在表示int型数的格式符d,o,x前面,表示short int型。
(4)*字符。这是一个抑制符,表示跳过关后面整数所指出的输入域宽,如果没有表示跳过的整数域宽,则跳过一个输入域'到下一个空白符。
[例10.1] 分析下列程序的输出结朱。注意标准格式输入函数的使用。
main()
int a.b,c;
prinrf("Enyer a b c");
scant("%2d%'*%3d,3d%4d",&a,&b,&c);
printf("a-%d,b-%d,c-%d\n",a,b,c
执行该程序输出如下信息:
Enter a b c:1234567890
输出结果如下:
a=12,b=678, c=90
说明:该例中,scanf ()函数中格式符里使用了数字来规定输入项的最大宽度,并用星号符来抑制某些输入项:该控制串中各格式符的规定说明如下:将前2位整数赋值给变量a,然后跳过3位整数,再将3位整数读取给变量b,最后还剩下2位数读取给变量c,变量c对应的输入最大宽度为4位,不足4位有几位取几位。在实际应用中,常用抑制符来跳过不想输入的数据项。
(2)标准格式输出函数pr}ntf
该函数的格式如下:
printf("(控制串)'',(参数表))
该函数有关参数说明在第一章中已经讲述过了。下面再作两点补充。
一是在<控制串)的格式符中,可以在%与格式说明之间加修饰符。该修饰符主要是用来指定输出数据项的宽度。常用的修饰符如下所述:
(1)数字。数字。小数点前的数字表示输出数据项的最小域宽,当实际输出数据项的宽度小于最小域宽时,按最小域宽输出。在右对齐的格式下,前面补空格符;当实际输出数据项的宽度大于最小域宽时,按实际宽度输出。小数点后面的数字表示输出数据项的精度。对浮点来讲,表示小数的位数;对字符串来讲,表示字符申中字符的最多个数;对整数来讲,表示输出项的最多位数。
(2)负号一。负号用来表示输出数据项中的字符左对齐,没有负号时为右对齐。一般情况下,左对齐,右边补空格符;右对齐。左边补空格符。
(3) 1字符。l字符用于表示int型数的格式符d,0,x的前面,表示长整型;用于格式符f的前面。表示双精度浮点数:
(4)0字符。0字符用于右对齐格式中替换数据项左边的空格符。
(5)*字符。*符用来通过变童的值指定域宽的。*字符要在输出数据项的参数表中对应一个表达式。该表达式的值为该输出项的宽度。
[例10.2] 分析下列程序的输出结果。注意prinft ()数中可变域宽和补0的应用。
main()
{
int i=5;
float x-12.345678;
printf("%*.3f\n",i,x);
printf("%0|c,*f\n".x);
printf("%0*.*f\n",|6,i,x);
执行该程序运行结果如下:
12.316
0012.34568
00012.34568
说明:
(1>在控制串"%*.3f\n"中,荞对应的表示域宽的变量为参数表中的i.i值为5,则控制串相当于"%5.3f\n".该格式要求小数取3位,该数值整数有2位。加1位小数点,共6位,大于指定的最小域宽5,于是按实际宽度输出,最后一位四舍五入。
(2)在控制串"%O1O.*f\n'中,*对应的表示小数位数的变量为参数表中的i,即5格式中指定最小域宽为l0.并且数据前面补的空格符用0替换。输出数据有2位格数,5位小数,再加1位小数点,共8位,因此数据前还应有2个0.
(3)在控制串"%o.*f/n"中、第一个*对应的表示最小域宽的变量为参数表中i+6表达式,其值为11,第二个*对应的表示小数位数的变量为参数表中的i,即5.格式中又指定用0替换数据前填补的空格符。因此,输出结果为OOO12. 345680。
二是printf()函数也有一个返回值,该值是表示输出函数所输出的所有数据项所占的总宽度。
[例10.3] 分析下列程序输出结果。注意分析printf()函数的返回值。
main()
{
int a,b,c;
a=100;
b=256;
c=printf (" %05d,%05d\n”,a,b);
printf("%d\n",c);
)
执行该程序输出结果如下
00100,00256
12
说明:程序中变量c是用来存放printf ()函数的返回值的。该函数的实际输出宽度是a,b
变量各5位,逗号1位,换行符1位,共12位。
C语言基础教程标准文件的读写函数应用
标准文件的读写函数在C语言程序中有着广泛的应用,因此熟练地掌握这些函数是十分重要的。特别是scanf ()和printf ()函数应用更多,而它们还有一定的复杂性,在应用中更应特别注意。下面讲述这些函数在使用中应该注意的一些事项。
(1)由于getch()函数是带有缓冲区的,使用时应注意缓冲区剩余字符对后面输入函数的影响。
[例10.4]分析下列程序的输出结果。
#include
main()
{
int i.j,k;
printf(" Enter 1 character:“);
i=getchar();,
printf("%C\n",i);
printf("Enter ! character;");
j=getchar( );
printf("Enter 1 character:”);
k=getchar()。
printf("%c,%c\n",j,k);
}
执行该程序后,显示如下信息:
Enter 1 character: a
健入字符a和回车后,输出如下信息:
a
Enter 1 character:Enter 1 character:b
健入字符b和回车后,输出如下信息:
.b
说明:该程序中使用getchar()函数从键盘中接收到字符,当在"Enter 1 charade ;"提示信息后输入a后,则输出信息如上所示,其原因是因为键入的实际是两个字符,a字符和回车符。将a字符送给变量i.将回车符送给了变量j,因此第二个"Enter 1 character:"提示则不需要再输入字符,于是出了第三个"Enter 1 character"提示,当键入b了后,输出结果告诉我们,i变量中的字符的确是回车符,因为在输出,b字符之前空了一行,而k变量的字符为b. 为了实现每个提示信息都要输入一个字符送给相应的变量,就需要及时消除缓冲区内多余的字符。例如,键入a了后,缓冲区中有两个字符,a 是有用的,回车符是多余,于是要将多余的回车符消除,否则它将影响后面的继续输入。其办法可用getchar()函数来吃掉一个字符。上述程序可作如下修改。
#include
main()
{
int i,j,k;
printf("Enter 1 character:“);
i=getchar();
getchar();
prinif("%c\n",i);
printf("Enter 1 character:");
j=getchar();
getrhar();
printf("Enter 1 character:”);
k=getchar ();
printf ("%c,%c\n",j,k)
}
执行该程序市场如下信息;
Enter 1 character: a
a
Enter 1 character: b
Enter 1 character: C
b,c
执行该程序市场如下信息;
Enter 1 character: a
a
Enter 1 character: b
Enter 1 character: C
b,c
说明:该程序中增加了两条getchar();语句,其目的是为了消除缓冲区中剩余的无用字符,使程序得以正常进行。该程序中,由于缓冲区中只有一个多余字符,因此使用一次getchar()函数,如果缓冲区中有多个剩余字符又该怎办呢?请读者思考。
(2)标准格式输入函数scan ()也是带缓冲区的,它也存在有剩余字符的及时处理问题。
[例10.5] 分析下列程序输出结果。注意由于scanf()函数是带缓冲区的所产生的影响。
main()
{
char s1[10],s2[10];
printf("Input a string :");
scanf("%4s",s1);
printf("s1,%s\n",s1);
printf("Input a string:");
scanf("%s",s2);
}
执行该程序显示如下信息:
Iinput a string:abcdef
s1:abcd
Input a string :s2:ef
执行该程序显示如下信息:
Iinput a string:abcdef
s1:abcd
Input a string :s2:ef
说明:出现上述输出结果是因为键人abcdef加回车键后,字符数组S1接受4个字符abed,
并自动加上字符串结束符。这时字符串缓冲区中还有ed和换行符。程序中输出显示s1后,屏幕出现下一个,"Input a string;"提示信息,由于缓冲区还有剩余字符,则不再需要键盘输人信息。而自动将缓冲区剩余字符ef赋给字符数组s2.出现s2:ef的结果。
为了及时清除缓冲区中的剩余字符,叮在下一次使用scanf()之前,用下述方法清除缓冲区中的剩余字符:
while (getchar());
(3)在scanf()函数中,%c与%s这种格式的区别主要表现在如下两个方面:一是字符格式时变量只接收一个字符;而字符串格式时除接收规定的字符外,还自动加'\0',二是字符格式时,遇到字符包含空格符都作为字符输入;而字符串格式时,非空格符前边的前导空格被略去,不作为字符输入,而从非空格符开始进行输入。
[例10.6] 分析下列程序的输出结果。注意格式符%c与%s的区别。
main()
{
char s[]="1234567";
printf("Input s:");
scanf("%4c",s);
printf("s:%s\n",s);
printf("Input s:");
scanf("%4s",s);
printf("s;%s\n",s);
}
执行该程序输入如下信息:
Input s:ab
s: ab567
Input s: ab
s:ab
说明;该程序中输人两个相同的字符串,但是输出结果却不同,其原因在于scanf ()函数中两次所用的格式符不同,一次用%4c,另一次使用%4s.于是,该程序的输出结果将十分清楚告诉我们,%c 和%s,这两种格式的区别,详细情况请读者自行分析。
(4) scanf()函数在正常情况下,它的参数表中的每个参数都能获得指定的数值,但在非正常情况,当某个参数所斌予的值与其指定的格式相矛盾时,则结束整个的输入,scan(()函数中后面的参数将没有被赋值。
[例10.7] 分析下列程序的输出结果。注意scanf()函数的返回值和各变量的输出结果。
main()
{
int a,n
char b;
float c;
n=scanf ("%3d%c%f",&a,&b,&c);
printf(" %d\n",n);
printf ("%d,%c,%f\n",a,b,C);
}
当输入信息流如下所示:
123 a 146.78
这时的输出结果如何呢?有人认为输出结果应该如下所示:
3
123.a.16.78000
可见,实际上的输出结果并非如此,为什么呢?请读者自己分析,并上机验证。
如果将输入信息流改为下述情况:
123a46.78
结果又将回怎么样呢?
进一步加深对%c格式的认识。
(5)在实际中字符串的输入和输出可以使用gcts()和put()函数比较方便。
【例10.8】分析下列程序的输出结果。注意gets()和puts()函数的使用方法;
mxin()
{
char s1[10],s2[10];
printf ("Input a string:“)
gets (sl);
puts (s1);
printf ("Input a string:”)
gPtS(S2);
puts(s2);
执行该程序显示如下信息:
Input a string:ahcde
abcde
Input a string:xyxmn
xyzmn
说明:该程序中使用gets()函数从键盘一上接收一个字符串,使用puts()函数将该字符目输出到屏幕上显示,使用起来十分方便。
实际中也可用gets ()函数接收一个整型数,然后用atoi()函数将它转换成整型数。
C语言基础教程打开文件函数和关闭文件函数
一般文件在对它进行读写操作之前需要打开,打开文件函数格式如下:
fp=fopen ("(文件名)",(打开方式))
其中,fopen是打开文件函数的名字,该函数有两个参数,一个是(文件名),该参数是一个字符串,需用双撇号("")括起,文件名要全一名,即包含路径名和扩展名。另一个是(打开方式),它也要用双撇号括起。打开方式的选择如下所示:
r 表示读方式
w: 表示写方式
a: 表示追加写方式
r十w: 表示读写方式,也可写成r十
rb: 表示二进制文件读方式
wb: 表示二进制文件写方式
ab; 表示二进制文件追加写方式
br+: 表示二进制文件读写方式
该函数如果成功地打开了指定的文件,则返回该文件的内存缓冲区的首地址,将它赋给一个被定义为文件指针的变量,于是该指针将指向这个被打开的。文件,直到被关闭为止;如果该函数没有成功地打开文件,则返回值为NULL.因此,在执行打开文件的操作后,总要判断一下返回值是否为NULL_,如果返回值为NULL,则说明文件打开失败,一般应退出该程序,检查失败的原因。因此,常用如厂程序段来对没有打开文件进行处理:
if(fp=NULL)
)
printf("file can't open!\n"):
exit(l);
其中,fp是文件指针,用它来接收fopen ()函数的返回值。exit()是。个退出当前的执行的程序的函数,当文件没有被打开时,一般应退出程序。
函数只有被成功的打开后才可以对它进行读写操作。一旦文件的读写操作完成后,应该及时地将它关闭。关闭文件函数的格式如下:
fclose(fp)
其中,fclose是关闭文件函数的函数名。 fp是要关闭文件的文件指针。使用该函数可以将一个被打开的函数关闭,同时释放它所占用的内存缓冲区。当不使用该函数关闭打开的文件时,当该程序执行完后,也会将打开的文件关闭。
关于打开文件函数fopen()和关闭文件函数fclose()将在后面举例说明。
C语言基础教程一般文件读写函数及其使用
一般文件的读写函数共有4对,下面分别加以介绍,并且举例说明它的使用。
1.对一个字符的读写函数
(1)一个字符的读写函数fgetc ()
该函数的功能是从被打开的文件中读取一个字符。该函数的调用格式如F:
c=fgexc(fp);
其巾,fgetc.是该函数的函数名,印是一个文件指针,c是一个char型变量,使用fgetc ()函数可从由fp指针所指向的文件中读取一个字符送给某个char型变量c.反复使用该函数可以将某个文件从头到尾读一遍,直到文件结束,即遇到EOF时为止。如果fp为stdin时,该函数等价于getchar()函数。
使用该函数读取文本文件时,当读取到EOF时便可结束,因此要作如下判断:
(c=fgetc 若满足上述条件,可继续读取;若不满足该条件,则结束读取。 使用该函数读取二进制文件时,常用feof ()函数来判断是否文件结束,因为EOF被定义为一1,用来判断二进制文件不太合适。fcof ()函数调用格式如下; feof (fp); 该函数返回值为1时表示文件结束,该幽数返回值为。时表示文件没有结束。因此,在采用循环方式读取二进制文件内容时,循环语句的条件如下所示: !feof(fp) 该表达式值为非0时,继续循环;该表达式值为0时表示文件结束,则停止循环。这种方法也可以用于文本文件的操作中。 (2)一个字符的写函数fputc() 该函数的功能是将一个指定的字符写到指定的文件中。调用格式如下: fput(c,fp); 其中,如fputc是该函数的函数名,fp是一个文件指针名,c是一个char型变量。该函数用来将变量c中的字符写到文件指针fp所指向的文件中。该函数成功时返回所写字符的代码值,失败时返回EOF. 当fp为stdout时,fpuatc(c,stdout)函数等价于putchar(c)函数。 [例10.9]显示一个文件的内容。 #include main(argc,argv) int argc; char * argv[]; { int c, F1LE*fp if(argc!=2) { printf("Foemat:\n\t%s filename\n",argv[0]; exit(1); } f(fp=fopen(argv[1],"r"))==NULL) { printf("Th file %s,can't open,\n",argv[l]); exit(2); while((c=fgetc(fp))!=EOF ) putchar(c); fclose(fp); } 执行该程序时,将命令行参数中所指定的文件的内容显示在屏幕上。 说明:该程序主函数中使用了两个参数argc和argV,它们分别用来存放命令行中参数的个数和参数的内容。执行该程序时,命令行需要有一个参数,该参数(实参)应该是被打开文件的文件名,即将该文件内容显示在屏幕上。假定该程序编译连接后可执行文件名为typefile.exe,则命令行格式如下: typefile fl. c 其中fl.c是要显示的文件的名字。执行该命令行后。fl.c一文件的内容被显示在屏幕上。 该程序是用fgetc()函数,从fp文件指针所指向的文件中读取每一个字符,再用putchar()函数将它显示在屏幕上。 [例10.10] 复制一个文件。 #include main (argc,argv} int argc; char*argv}}; { int c; FILE,*fp,*fp if(argc!=3) { printf("007Usage:command fife 1 fife2.\n"); exit(1): } if ((fp} fopen (argv[1],'r'} r))== NULL) printf("007The file %s can't open.\n",argv[1]); exit(2); { if( (fq=fopen (argv[2],'w')==NULL printf("\007The file %s can't open.\n”,argv[2]); exit(3); } while((c=fgetc(fp))=EOF) fputc(c,fp); fclose(fp); fclose(fp) } 执行该程序,则将命令行中参数1所指定的文件名中的内容复制到由参数2所指定的文件名中,假定该程序经过编译连接后,生成的可执行文件名为c0pyfile. exe,则命令行格式如下: copyfile f1. c f2.c 其中,fl.c是源文件名,f2.c是目标文件名,该程序将fl.c文件的内容复制到f2.c中,使得fl, c成为fl.c的一个副本。 该程序中,使用fgetc ()函数从fp文件指针所指向的文件中一个字符一个字符地读取,再使用fputc ()函数将读取的一个个字符写到由fq指针所指向的文件中。这里,印指向文件fl.c.fq 指向文件f2.c (3)字符回送函数ungetc() 该函数的功能是将预读的一个字符送回原文件中,即将文件的读写指针向文件头移动,一个字符。该函数的调用格式如下: ungctc(c,fp); 其中,ungetc是该函数的名字,c是被回送的字符,fp是被操作的文件。 2.对一个字符串的读写函数 (1)一个字符串的读函数fgets() 该函数的功能是从指定的文件中读取一个字符串放到指定的字符数组中。该函数的调用格式如下: (gets(s,n,fp) 其中,fgets是该函数的函数名,该函数有3个参数:,是一个用来存放读取出来的字符串的字符数组名,或字符指针名;n是用来指定读取字符的个数,其中包含字符串结束'\0',实际上读取字符为n-I个;fp是被读取字符串的文件指针。该函数是从被打开的由fp文件指针所指向的文件中读取n-1个字符送到所指定的字符数组,中。在实际操作中,不一定每次都读取n一1个字符,当读取到换行符或文件结束符时,都将结束读取操作将已读取的字符送到数组S中。该函数的返回值是指向字符数组s的指针,出错时返回NULL a读入到s中的字符自动加,\0'. (2)一个字符串的写函数fguts () 该函数的功能是将指定数组中的字符串写到由文件指针所指向的文件中。该函数的调用格式如下: (fput(s,fp) 其中,fputs是该函数的函数名,该函数有2个参数:一个是存放已知字符串的字符数组s,另一个是被打开文件的文件指针fp.该函数是用来将字符数组s中的字符串写到fp文件指针指向的文件中。正常时函数返回写入文件的字符个数,出错时返回NULL.参数s可以是字符数组名、字符指针名,也可以是一个字符串常量。 3.对一个数据块的读写函数 (1)数据块的读函数freed () 该函数的功能是从指定的文件中读取一个数据块到指定的内存缓冲区中,数据块的大小取决于数据块中数据项的大小(字节数)和数据项的项数。该函数的调用格式如下: fread(ptr,size,nitem ,fp) 其中,(read是该函数的函数名,该函数有4个参数分别是:ptr是j个指针,用来指出数据块在内存的起始位置;size表示数据块中每个数据项的大小,以字节为单位;nitem表示数据块中数据项数;fp是一个文件指针,用它指出读取数据块的文件。例如,在一台16位机上从某个文件中读取10. 个浮点数,放到数组buff中。可写成如下格式: freed (buff,4,100,fp); 或者, fread (buff,siaeofffloat).lO0(fp); 显然,后一种格式也适用于32位机。 该函数正常时返回实际读取的数据项数,非正常时返回O. (2)数据块的写函数fwrite() 该函数的功能是将指定的内存缓冲区中的数据块中所有数据项写到所指定的文件中。所写数据块的大小是由数据块中数据项的大小和项数决定的。该函数的调用格式如下所示: fwrite (ptr,size,nitem,fp); 其中。(write是该函数的名字,它有4个参数,每个参数的含意与fread ()函数参数相同。该函数就是将由ptr所指向缓冲区内的nitem个数据项(每个数据项为size个字节)的数据块写到由如所指向的文件中。该函数正常返回实际写入文件的数据项数。 4.一般文件的格式读写函数 (3)一般文件的格式读函数fscanf () 该函数的功能是按指定的格式从一个指定的文件中读取数据。给该函数参数表中各变址赋值。该函数的调用格式如下: fscanf(fp,"(控制串)",(参数表)) 其中,fscanf是该函数的文件名,该函数中的参数除了fp是一个被打开文件的文件指针外,其余参数与 scanf()完全相同。该函数与标准格式读函数的区别仅在于前者是从指定的某个文件中读取数据,而后者是从键盘上读取数据。如果将该函数中的fp指定为stdin,则它与scanf()函数是等同的。 (2)一般文件的格式写函数fprintf () 该函数的功能是按指定的格式将该函数参数表中给定的表达式的值写到指定的文件中。调用格式如下所示: fprint(fp)," (控制串)'',(参数表>) 其中,f printf是该函数的名字,该函数的参数中除了fp是某个文件的指针外。其余参数与标准格式写函数printf ()函数完全相同。fp是该函数要写入数据的文件指针,如果fp为stdout则该 函数printf ()函数等同。因此,该函数与printf ()函数的区别仅在于前者是将数据写到指定的某个文件中,而后者将数据写到显示屏幕上。例如。已知 int a = 34; float b=56.78; 而语句 fprintf (fp,%d,%8.2f",a,b); 将变量a的值按%d格式,将变量b的值按%8. 2f格式写到由fp文件指针所指向的文件中。于是fp所指向的磁盘文件上便有如下格式的字符串: 34,56, 78 还可以使用fscanf ()数将某个磁盘文件上的土述字符串读出,并赋值给两个变量,使用的函数格式如下: fscanf (fp,"%d,%f" ,&a,&b); 这时,该函数将从fp文件指针所指向的文件读出3-) }给变量a,y出56. 7$}给变量b} 使用上面讲述的两个函数fscanf ()和印rintf ()对磁盘文件读写是很方便的,但是由于这两个函数在输入时要将ASCII码转换为二进制形式,在输出时又要将二进制形式转换为ASCII码,这样要花费一些转换时间,而使用freaci()和fwrite ()函数就不需要进行这种转换所以在频繁交换数据的情况下,还是使用fread ()和(write ()好些, C语言基础教程文件定位函数及其使用 文件定位函数包含有定位读写指针函数、归位读写指针函数和返回读写指针函数等。这里的读写指针是指当打开一个文件时系统自动建立一个标识文件中当前字符位置的指针,该指针随着对文件的读写操作而不断的移动。例如,为厂读一个文件而将该文件打开,这时读写指针指在文件头,随着该文件中的字符不断被读出读写指针将向文件尾方向移动,该文件全部读完,则读写指针指向文件尾。读写指针不同于文件指针,读者要将二者区分开。 1.定位读写指针函数fseek () 该函数的功能是将文件的读写指针从某个位置移到指定的位置,该函数将为C语言对文件的随机读写提供了方法。该函数调用格式如下: fseek(fp, f<偏移量),(起始位置)) 其中,fseek是该函数的函数名;fp是指向被操作文件的文件指针;<偏移量)是表示移动当前读写指针的距离量,该参数的类型为long int型;<起始位置)是偏移量的相对位置。例如,起始位置为文件头,偏移量为50,则表示将读写指针移到相对文件头距离为50个字节的位置。起始位置的设置方法有三; 0表示相对于文件头 1表示相对于文件的当前位置 2表示祖对于文件尾 实际中,常用宏定义来替代起始位置,规定如下: SEEK_SE'C表示文件头 SEEK_CUR表示当前位置 SEEK_END表示文件尾 例如: fseek(fp,200L,0);将读写指针移到离文件头20.个字节处。 fseek(fp, 80L,1);将读写指针移到离当前位置80个字节处。 fseek (fp , -50L,0);将读写指针移到从文件尾向后退50个字节处。 该函数一般用于二进制文件。如果用于文本文件要发生字符转换,计算位置时会发生误差。 2.归位读写指针函数rewind () 该函数的功能是将某个文件的读写指针归位于文件头。该函数的调用格式如下: rewind(fp) 其中,rewind是该函数的函数名,fp是被操作文件的文件指针。使用该函数后,会使被操作文件的读写指针指向文件头。该函数的功能与下列函数功能相同。 (seek (fp,OL.0); 3.返回读写指针函数ftell () 该函数的功能是返回指定文件当前读写指针的位置,该位置是用相对于文件头所相隔的字节数来表示。例如,该函数返回某个文件的当前读写指针的位置是100字节,即表示当前读写指针在离文件头有100个字节处。该函数调用格式如下: ftell(fp) 它返回一个表示字节数的long int型数值。 [例10.15] 建立一个数据文件,随机读取其中的某个数据。 使用fprintf()函数建立一个数据文件xy. dat ,然后,指定从某个数据起连续读出若干个数据,最后,再读出这组数据的起始数据。 程序内容如下: #inciude main ( ) { int i,x,y; FLLE * fp; fp=fopen("xy. dat" ,"wb十rb"); for (i=O;i<20;i++) fprintf (fp,,%5d",i+1); printf("\nlnput x:"). scanf(^%d"&x), for(i=o;i<5:i十十) { fseek(fp, (long) (5*(x一l+i),0); fscanf (fp ,"%d",&y); printf("%d\t",y). } fseek(fp,(Iong)(5*x一5),0): fscan((fp,"%d",&c ), printf("\n%d\n",&x); fclose(fp); 执行该程序运行结果如下: Input x:10 10 11 12 13 14 lo 说明:该程序先打开一个文件xy.dat,以二进制数的读写方式,用for循环方法向文件中写入20个整型数,这里使用的是fprintf()函数。再从键盘上键入一个数值赋给x,表示从文件中第x个数据项开始读取数据,并将它显示在屏幕上。本程序中,指定从第1O个数据项开始,连续读出5个数据项,暂存在变量Y中,输出到显示屏幕上,这里使用fseek ()函数进行定位,让读写指针移到第1o个数据项,并从该数据项开始输出。程序中又使用(seek ()函数重新定位读写指针,使它再指向第1o个数据项,再读取该数据,输出显示为10. [例10.16] 编写一个程序使用frell ()函数估算一个文件的大小。 #include main () { long i; FILE*fp; if((fp=fopen("ab,txt" ,"r"))==NULL) { printf("File can't open.\n"); exit(1); (fseek(fp,OL,2): i=ftell(fp); printf("file size;%ld\n",i); } 执行该程序输出结果如下。 file size: 20 说明:该程序可用来估算一个文件的长度或大小。本例中,估算文件ab.txt的大小为20个字节,该文件是本章例10.11中的一个文件。函数ftell ()是用来返回当前读写指针到该文件头相距的字节数。 C语言基础教程动态存储分配函数 动态存储分配函数不同的编译系统所提供的多少不同。有的编译系统放在malloc.h中,有的编译系统放在stdlib.h中。常用的有如下几种: 1.内存分配和释放函数mall0c()和free() 这些函数前面已经出现过。malloc ()函数的功能是动态地向内存申请指定大小的空间,所指定的大小用字节数表示。其调用格式如下: malloc(size) 其中,malloc是该函数名,size是用来表示所申请的内存大小的字节数。该函数的返回值为void*型,即为某种类型的指针,使用时将其返回值强制成某种类型的指针。当申请成功时该函数返回所申请内存的缓冲区的首地址,否则返回NULL. 例如,实际中申请50个整型变量的内存空间可以这样使用: int * p; p=(int*)malloc ( 50*sizeof (int)); if(P==NULL) { prints("out memory!\n"); exit(1); 当申请内存空间时,总是要判断一下是否申请成功。如果申请成功了,继续往下进行;如果申请失败,则应退出该程序。 free()函数的功能是用来释放使用mallac ()函数分配的内存空间。由于机器中用来进行动态分配的内存空间是有限,及时释放不用的内存空间是十分重要的。该函数调用格式如下: free(p) 其中,free是该函数的名字,P是要被释放的内存空间的首地址,也是使用。malloc ()函数所分配的内存空间的返回值。执行该函数则使指针P所指向的内存区域被释放。 C语言基础教程系统调用函数 C语言中提供一个支持系统命令的函数,即系统调用函数system ().该函数调用格式如下: system ("(系统命令字)") 其中,system是该函数的函数名,其参数是一个字符串,该串是系统命令字。它可以是系统的各种命令,例如,在D05系统下,可以是: system("date"); 该函数将直接执行SOS系统下的date命令,将当前的日期显示在屏幕上。 使用该函数可以将在一个程序中执行另一个编译连接好的可执行文件(即命令),这将为程序的嵌套执行提供了方便。 [例10.17] 使用系统调用函数,ystetm()在一个程序中运行另一个程序。 main() { printf ("Type llo一l6.c:\n"); system("type 110一16.c" ); printf("Run output:\n"); system("110一15"); } 执行该程序运行结果如下: Type 11o一16.c: # include main() { long i. FILE;fp, if((fp=fopen ("ab. txt" . "r"))=NULL) { printf ("File can't open.\n”)。 exit(1), } fseek(fp.OL,2) i=ftell(fp); pritf("file siae:%ld\n".i); } Run output: file site : 20 说明:该程序中两次调用system ()函数,第一次调用是将例10. 16程序内容输出显示在屏幕上,110-16. c是例10. 16程序文件名,这次函数调用是执行下述DOS命令: type 110一16.c 第二次调用system ()函数是输出10-16.c.文件的结果。110-16.c经编译连接后生成可执行文件10-16.exe.这次函数调用是执行下述DoS命令: 文件是指存储在外存中的数据集合。 输入到计算机内存中的数据是不能长期保存的,机器一旦断电,内存中的信息全部丢失。 一、文件类型概述 1.ASCII文件和二进制文件 在C语言中文件有两种存储方式:其一,数据以字符格式编码,即写入文件的一切数据都被看作是字符,因此文件是由一个一个字符组成的。在文件存储区中,每一个字节存放一个ASCII码,按这种方式编码形成的文件称为“ASCII”文件或“字符流”文件;其二,存储在文件中的数据一律以内存中的存储形式(即二进制编码形式)存储,一个字节不对应一个字符,按这种编码方式形成的文件称为“二进制”文件。 数据若以二进制格式编码,存储开销小,而且数据从内存写入磁盘的时候不必转换,若以字符格式编码,除了存储开销大外,内、外存交换数据时需要转换内码,但它的好处是文件可以直接阅读,即在DOS下用Type命令就可以阅读文件内容,而二进制文件是不可读的。 2.缓冲型文件系统和非缓冲型文件系统 这是指C语言处理文件的方式。为了提高程序的执行效率,减少程序对磁盘的读写速度,在操作系统的管理下,C语言为每一个已经打开的文件在内存中开辟出一块“缓存区”,当由内存向磁盘写数据时,先将数据转存缓存区,待缓存区装满以后一并写入磁盘。同样,从磁盘像内存中读入数据时,也是先将读出的数据转存缓存区,待装满以后才从程序一步一步的读入处理。如果一个程序同时打开多个文件,系统会自动在内存中为各个文件开辟各自的缓存区并编写相应的号码,使文件的操作互不干扰,这种文件处理方式称为“缓冲型文件系统”。 非缓冲型文件处理系统是指系统不自动为已打开的文件开辟内存中的缓存区,而是由用户自己在程序中设定,这种处理方式由于可移植性差,ANSI标准已经不再采用。 3.文件类型和文件指针 在C编译系统,文件类型是编译系统预先定义的一种结构类型,取名为FILE,用于存储文件的相关信息。其结构组成为: typedef struct { short level; /*缓存区满或空的标志*/ unsigned mode; /*使用状态标志*/ int fd; /*文件号*/ short buffsize; /*缓存区大小*/ char *buff; /*缓存区位置*/ char *curp; /*文件指针当前的指向*/ }FILE; FILE类型是系统预定义的结构,其中包含的成员数不固定,随编译系统版本的不同而不同。 FILE类型是在头文件stdio.h中定义的。 文件指针是文件的读写的位置标志。要正确读写文件就必须知道文件的各种信息:比如文件的名字、允许使用的方式、缓存区的位置和空闲字节数、文件当前的读写位置等。 指向文件的指针变量称为“文件指针”,它是用FILE类型来定义的,其形式为: FILE *指针变量名; 二、文件的打开与关闭 1.文件的打开 打开文件可以调用函数fopen来实现,其形式为: 《C语言程序设计》第十章文件 C语言文件操作是指对文件进行输入和输出操作以及对文件进行读写管理的过程。在C语言中,通过文件操作我们可以实现对磁盘上的文件进行读写操作,以及对文件进行打开、关闭、创建和删除等管理操作。 文件操作在C语言中是通过标准库中的文件操作函数来实现的,这些函数包括fopen、fclose、fread、fwrite、fgets、fputs、fseek等。这些函数提供了一系列的接口来实现对文件的读写操作。 首先,我们需要通过fopen函数来打开文件。fopen函数的原型为:FILE *fopen(const char *filename, const char *mode)。其中filename是要打开的文件名,mode是打开方式。mode参数有以下几种:-"r":只读方式打开,文件不存在则打开失败。 -"w":写入方式打开,文件不存在则创建,若文件存在则清空原有内容。 -"a":追加方式打开,文件不存在则创建,若文件存在则在文件末尾追加内容。 - "rb"、"wb"、"ab":二进制方式读写文件,同上。 fopen函数返回一个指向FILE结构类型的指针,即文件指针,用于后续对文件的操作。 打开文件后,我们可以使用fread函数和fwrite函数来进行文件的读取和写入操作。fread函数的原型为:size_t fread(void *ptr, size_t size, size_t count, FILE *stream);fwrite函数的原型为:size_t fwrite(const void *ptr, size_t size, size_t count, FILE 主题:(二十三) 文件操作 一、标准文件的读写 1.文件的打开fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此FILE指针来实现对指定文件的存取操作了。当使用打开函数时,必须给出文件名、文件操作方式(读、写或读写),如果该文件名不存在,就意味着建立(只对写文件而言,对读文件则出错),并将文件指针指向文件开头。若已有一个同名文件存在,则删除该文件,若无同名文件,则建立该文件,并将文件指针指向文件开头。 fopen(char *filename,char *type); 其中*filename是要打开文件的文件名指针,一般用双引号括起来的文件名表示,也可使用双反斜杠隔开的路径名。而*type参数表示了对打开文件的操作方式。其可采用的操作方式如下: 方式含义 r 打开,只读 w 打开,文件指针指到头,只写 a 打开,指向文件尾,在已存在文件中追加 rb 打开一个二进制文件,只读 wb 打开一个二进制文件,只写 ab 打开一个二进制文件,进行追加 r+ 以读/写方式打开一个已存在的文件 w+ 以读/写方式建立一个新的文本文件 a+ 以读/写方式打开一个文件文件进行追加 rb+ 以读/写方式打开一个二进制文件 wb+ 以读/写方式建立一个新的二进制文件 ab+ 以读/写方式打开一个二进制文件进行追加 当用fopen(0成功的打开一个文件时,该函数将返回一个FILE指针,如果文件打开失败,将返回一个NULL指针。如想打开test文件,进行写: FILE *fp; if((fp=fopen(test,w))==NULL) { printf(File cannot be opened\n); exit(); } else printf(File opened for writing\n); …… fclose(fp); DOS操作系统对同时打开的文件数目是有限制的,缺省值为5,可以通过修改CONFIG.SYS文件改变这个设置。 C语言文件操作函数 2007-10-17 19:21 13.1C语言文件 1,两种文件存取方式(输入,输出方式) 顺序存取 直接存取 2,数据的两种存放形式 文本文件 二进制文件 13.2文件指针 定义文件类型指针变量的一般形式: FILE *指针变量名; 例如: FILE *fp1,*fp2; 13.3打开文件 在使用文件之前,需打开文件.在C里使用fopen函数打开文件.格式为: fopen(文件名,文件使用方式); 此函数返回一个指向FILE类型的指针.如: FILE *fp; fp=fopen("file_1","r"); 如果调用成功,fp就指向file_1,否则返回为NULL,所以为了保证文件的正确使用,要进行测试.采用如下语句: If((fp=fopen("file_1","r"))==NULL) { printf("Cannot open this file\n"); exit(0); } 最常用的文件使用方式及其含义如下: 1,"r".为读而打开文本文件.(不存在则出错) 2,"rb".为读而打开二进制文件. 3,"w".为写而打开文本文件.(若不存在则新建,反之,则从文件起始位置写,原内容将被覆盖) 4,"wb".为写而打开二进制文件. 5,"a".为在文件后面添加数据而打开文本文件.(若不存在,则新建;反之,在原文件后追加) 6,"ab".为在文件后面添加数据而打开一个二进制文件. 最常用的文件使用方式及其含义如下: 7,"r+".为读和写而打开文本文件.(读时,从头开始;在写数据时,新数据只覆盖所占的空间,其后不变) 8,"rb+".为读和写而打开二进制文件.只是在随后的读写时,可以由位置函数设置读和写的起始位置. 9,"w+".首先建立一个新文件,进行写操作,随后可以从头开始读.(若文件存在,原内容将全部消失) 10,"wb+".功能与"w+"同.只是在随后的读写时,可以由位置函数设置读和写的起始位置. 最常用的文件使用方式及其含义如下: 11,"a+".功能与"a"相同;只是在文件尾部添加新的数据后,可以从头开始读. 12,"ab+".功能与"a+"相同;只是在文件尾部添加新数据之后,可以由位置函数设置开始读的起始位置. 13.4关闭文件当文件的读写操作完成之后,使用fclose函数关闭文件.格式如下: fclose(文件指针) 如:fclose(fp); 13.5调用getc(fgetc)和putc(fputc)函数进行输入和输出 1,调用putc(或fputc)函数输出一个字符 调用形式为: putc(ch,fp); 功能是:将字符ch写到文件指针fp所指的文件中去.当输出成功,putc函数返回所输出的字符;否则,返回一个EOF值.EOF是在stdio.h库函数文件中定义的符号常量,其值等于-1. 13.5调用getc(fgetc)和putc(fputc)函数进行输入和输出 例如:把从键盘输入的文本按原样输出到名为 file_1.dat文件中,用字符@作为键盘输入结束标志. #include Void main() { FILE *fpout; char ch; if(fpout=fpopen("file_1","w")==NULL) { printf("Cannot open this file!\n"); exit(0); } ch=getchar(); while(ch!='@') { fputc(ch,fpout); ch=getchar(); } fclose(fpout); } 2.调用getc(或fgetc)函数输入一个字符 调用形式为: ch=getc(pf); 功能是:从pf指定的文件中读如一个字符,并把它作为函数值返回. 例如:把一个已存在磁盘上的file_1.dat文本文件中的内容,原样输出到终端屏幕上. #include void main(){ FILE *fpin; char ch; if((fpin=fopen("file_1.dat","r"))==NULL) { printf("Cann't open this file!\n");exit(0);} ch=fgetc(fpin); while (ch!=EOF) { putchar(ch); ch=fgetc(fpin);} fclose(fpin); } 13.6判断文件结束函数feof EOF可以作为文本文件的结束标志,但不能作为二进 c语言入门教程 C语言是一种面向过程的编程语言,也是许多编程语言的基础。学习C语言可以帮助我们更好地理解计算机编程的基本原理 和逻辑。下面是一个简单的C语言入门教程。 1. 安装C语言编译器 首先,我们需要安装C语言编译器。常见的C语言编译器有GCC、Clang等。可以在官方网站上下载并按照说明进行安装。 2. 编写一个Hello World程序 打开一个文本编辑器,输入以下代码: ``` #include 行程序: ``` ./hello ``` 如果一切正常,你将会看到输出`Hello, World!`。 4. 理解代码 代码中的`#include 结构体: OPENFILENAME ofn; typedef struct tagOFN { DWORD lStructSize; (long)结构体的大小=sizeof(结构体名) HWND hwndOwner; HINSTANCE hInstance; LPCTSTR lpstrFilter; ------过滤器 LPTSTR lpstrCustomFilter; DWORD nMaxCustFilter; DWORD nFilterIndex; LPTSTR lpstrFile; ------文件名【绝对路径】 DWORD nMaxFile; ------sizeof(自定义存取文件名的变量) LPTSTR lpstrFileTitle; DWORD nMaxFileTitle; LPCTSTR lpstrInitialDir; LPCTSTR lpstrTitle; DWORD Flags; WORD nFileOffset; WORD nFileExtension; LPCTSTR lpstrDefExt; DWORD lCustData; LPOFNHOOKPROC lpfnHook; LPCTSTR lpTemplateName; } OPENFILENAME; 建完结构体之后一定要先清空!!!ZeroMemory(chat*,int);memset(); lpstrFilter ="ALL\0*.*\0TEXT\0*.txt;*.cpp\0" /* \0 过滤条件\0 */ nFilterIndex设置过滤窗口显示哪一种过滤条件用数字表示,从1开始,范围有过滤条 件的个数决定 Flags = OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST; Bool GetOpenFileName(OPENFILENAME* );打开对话框 GetOpenFileName(&ofn) 创建或打开文件 HANDLE CreateFile( LPCTSTR lpFileName, // pointer to name of the file DWORD dwDesiredAccess, // access (read-write) mode DWORD dwShareMode,// share mode LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, // how to create DWORD dwFlagsAndAttributes, / file attributes C语言基础教程文件和文件指针 1.文件 一般说来,文件是有序数据的集合。程序文件是程序代码的有序集合,数据文件是一组数据的有序集合。文件是被存放在外部存储设备中的信息。对文件的处理过程就是面向文件的输入和输出过程。文件的输入过程是从文件中读出信息,文件的输出过程是往文件中写入信息,文件的输入的过程使用读函数,实现文件输出的过程使用写函数。文件的读写函数是实现文件操作的主要函数,本章将用大量篇幅来讲述文件的读写函数。 C语言文件被称为流式文件,其特点是不分记录或块,将文件看成是信息"流"或看成是一个字符流(文本文件),或看成是一个二进制流(二进制文件).文件的存取是以字符(字节)为单位的,读写数据流的开始和结束受程序控制。任何一个文件都是以EOF结束,最简单的文件是只有结束符的空文件。 C语言文件包含有设备文件和磁盘文件,例如,键盘是一种输入信息的文件,显示器屏幕和打印机是输出信息的文件它们都属于设备文件。将内存的信息放到磁盘上保存,需要时再从磁盘上装入内存,这就要使用磁盘文件,磁盘文件是计算机中常用的文件n C语言文件按存放设备分设备文件和磁盘文件;按数据的组织形式分为文本文件(ASCII码文件)和二进制文件。文本文件是按一个字节存放一个字符的ASCII码来存放的;二进制文件是按数据在内存中的存储形式放到磁盘上的。例如,有一个整数10000,在内存中按二进制形式存放,占2个字节,将它放在磁盘上如按文本文件形式存放,占5个字节,每个数位占一个字节。两种存放方式各有利弊。以文本文件形式输出便于对字符进行处理,也便于输出字符,但是占用存储空间较多,并且要花费转换时间。以二进制文件形式输出可节省存储空间和转换时间,但是不能直接输出字符形式。 2.文件指针 文件指针是一种用来指向某个文件的指针。如果说某个文件指针指向某个文件,则是该文件指针指向某个文件存放在内存中的缓冲区的首地址。 每一个被使用的文件都要在内存中开辟一个区域,用来存放的有关信息,包括文件名字、文件状态和文件当前位置等。这些信息被保存在一个结构变量中,该结构变量所对应结构模式被系统定义为F ILE,它被放在,stdio h文件中。有些版式的FILE被定义如下: type struct { int fd; /*文件号*/ int cleft /*缓冲区内剩余的字符*、 int mode; /文件操作模式*/ char * mexic; /*下一个字符位置*/ char * huff; /*文件缓冲区位置*/ }FILE; c语言调用其他文件函数的方法-回复 C语言是一门常用的编程语言,而调用其他文件函数是我们在编写程序过程中常常会遇到的情况。在本篇文章中,我将一步一步地回答关于使用C 语言调用其他文件函数的方法。 1. 首先,确保你的程序中包含需要调用的函数所在的文件。假设我们的程序主文件是`main.c`,而要调用的函数则在另一个名为`functions.c`的文件中。我们需要在`main.c`中包含`functions.c`文件的头文件,即`#include "functions.h"`。 2. 创建一个头文件用于函数声明。在这个例子中,我们需要在 `functions.h`文件中声明我们要调用的函数。假设我们的函数叫做 `addNumbers()`,我们将在`functions.h`中添加以下代码: C #ifndef FUNCTIONS_H #define FUNCTIONS_H int addNumbers(int num1, int num2); #endif 这段代码中,`addNumbers()`函数被声明为带有两个整数参数并返回一个整数值的函数。 3. 在`functions.c`文件中实现被声明的函数。在这个例子中,我们需要在`functions.c`中实现`addNumbers()`函数。下面是一个简单的示例实现: C #include "functions.h" int addNumbers(int num1, int num2) { return num1 + num2; } 在这个例子中,`addNumbers()`函数将两个整数相加,并返回它们的和。 4. 在`main.c`中调用被声明的函数。在`main.c`文件中,我们可以直接通过函数名称来调用`addNumbers()`函数。下面是一个例子: C #include c语言标准函数获取文件名-回复 C语言标准函数获取文件名 在C语言中,获取文件名是一项非常常见的任务。C语言提供了一些标准函数,可以方便地获取文件名。本文将一步一步地介绍如何使用这些函数来获取文件名。 首先,我们需要使用` 例如,我们可以使用以下代码来获取文件名: c #include fopen函数打开的用法 标题:深入剖析fopen函数的用法及原理 摘要:本文将深入探讨fopen函数的用法及原理。fopen是一个在C语言标准库stdio.h中定义的函数,用于打开文件并返回一个指向该文件的指针。我们将从最基本的用法开始介绍fopen函数,然后逐步深入讨论其参数及返回值的含义,最后回顾一些常见的错误使用情况。 引言: fopen函数是C语言中用于打开文件的函数之一。在我们的日常编程中,我们经常需要读取或者写入文件,而正是通过fopen函数,我们才能够打开这些文件从而实现文件的读写操作。 1. fopen函数的基本用法 首先,我们需要了解fopen函数的基本用法。其声明如下: c FILE *fopen(const char *filename, const char *mode); 它接受两个参数:文件名以及打开模式。文件名是一个字符串类型的参数,指定 我们希望打开的文件的名称及路径。打开模式是一个字符串类型的参数,指定我们希望以何种方式对文件进行操作。 例如,要打开一个名为"test.txt"的文件,并进行写入操作,我们可以使用如下代码: c FILE *file = fopen("test.txt", "w"); 在成功打开文件后,fopen函数会返回一个指向FILE类型的指针,该指针指向打开的文件。需要注意的是,我们需要在使用完文件后,调用fclose函数关闭文件。 2. fopen函数的打开模式参数 接下来,我们将详细讨论fopen函数的打开模式参数。打开模式参数决定了我们可以对文件进行的操作,其中常见的几种有: - "r":只读方式打开,文件必须存在,否则返回NULL。 - "w":写入方式打开,如果文件存在,则截断文件长度为0,若文件不存在则创建新文件。 c语言拷贝文件函数-回复 C语言是一种广泛使用的编程语言,常用于系统编程和应用程序开发。在C语言中,拷贝文件是一种常见操作,它将源文件的内容复制到目标文件中。这样的操作在数据备份、文件传输等场景下非常有用。本文将详细介绍C语言中进行文件拷贝的功能函数。 1. 引言 在计算机领域,文件拷贝是非常常见的任务。当我们需要将一个文件的内容复制到另一个文件时,就需要使用拷贝文件功能函数。C语言提供了一种简便的方法来执行这个任务,它使用标准库函数`fopen`、`fread`和`fwrite`来实现。 2. 打开源文件 在开始文件拷贝之前,需要打开源文件以读取其内容。使用`fopen`函数可以打开源文件,以供读取操作使用。`fopen`函数的原型如下:c FILE* fopen(const char* filename, const char* mode); 这个函数接受两个参数,第一个参数是文件名(包括路径),第二个参数是打开文件的模式。常用的文件模式有`"r"`(只读)、`"w"`(只写)和`"a"`(追加)。在文件拷贝中,我们需要以只读模式打开源文件。 3. 打开目标文件 类似地,我们也需要打开目标文件,以便将内容写入其中。使用`fopen`函数的方式与打开源文件类似,但是打开模式需要选择`"w"`模式,即只写模式。 4. 读取源文件内容 一旦打开源文件,我们就可以使用`fread`函数来读取文件的内容。 `fread`函数的原型如下: c size_t fread(void* ptr, size_t size, size_t count, FILE* stream); 这个函数接受四个参数,第一个参数是读取数据的缓冲区,第二个参数是每个数据块的大小,第三个参数是要读取的数据块的个数,第四个参数是文件指针。在文件拷贝中,我们需要设置缓冲区的大小为适当的值,以防止内存溢出。 5. 写入目标文件 一旦读取到源文件的内容,我们就需要将其写入目标文件中。这可以通过`fwrite`函数来实现。`fwrite`函数的原型如下: c size_t fwrite(const void* ptr, size_t size, size_t count, FILE* stream); 1028 C语言笔记 冯诺依曼——程序=算法+数据结构。 1. 程序——机器可执行代码:预处理(执行#开头的指令,通常Preprocessor整合于编译器)、编译(compiler 把程序翻译成机器目标代码O,但还不可以运行)、链接(linker整合目标代码和附加代码,如库函数printf函数,此时最终可执行)。 2. 主函数:执行程序时系统会自动调用唯一的main函数,C语言区分字母大小写,不要写成MAIN。建议main函数末尾用一条return语句结束(否则某些编译器示警,返回的值是状态码,在某些操作系统中程序终止时可以检测到状态码),向操作系统返回0表示程序正常终止(任意终止程序状态则可调用exit函数)。 3. /* 注释开始 *良好的注释风格有:文件名,功能,作者,日期。下面为注释结束符。 *有些注释使用C++中的//简化,但这不符合C标准,而且不同于各编译器,可移植性差。 */ #include "stdio.h" /* 双引号告诉compiler先当前目录搜索需要包含的文件,再从指定的系统头文件目录下搜索*/ main( ) /* 翼型注释,自动调用唯一的main函数*/ { /* 可以使大括号独立一行,并且缩进与main 同齐 */ int height; /* main函数中的变量等声明必须放在程序语句之前,并建议以空白行隔开*/ printf("\n"); /* 缩进可用3个”空格“;注意各编译器Tab键占符不一,如8个、4个,故不宜用之 */ return 0; } 4. 对实体标识符命名中,可以含有字母、数字和下划线,但数字不能开头。C语言区分大小写。标识符常小写,并命名中间插以“_”。运算符前后可添加空格,以突显之。 #define PI 3.1415926 /* #为命令行,无需”;“,常量可以字母大写*/ #define EDIS asm(" EDIS") typedef unsigned int Uint16; C语言基础知识 1.每个C程序有且只有一个主函数main (),且程序必须从mainO 函数开始执行,并在mainO函数中结束。 2.在C语言中,用e来表示科学计数法时,规定在e的前面必须有数字,后面必须为整数。 3.用单引号括起来的一个字符常量只能存放一个字符;C语言屮没有字符串变量,只能用字符数组来存储字符串。 4.外部变量在编译时由系统分配永久的内存空间,所以外部变量的类型不是自动存储类别。 5.在一个函数内的复合语句屮定义的变量,只能在这个复合语句范围内有效。 6.用sizeof(int)计算int类型数据的字节数。 7.C语言运行时,首先系统检查语法的正误,再运行程序的语法; C语言屮,可以在一个函数中嵌套一个函数,但是不能在一 个函数中定义一个函数;只有在函数外部定义的函数才是外 部函数;C语言的子程序有过程和函数两种。 预处理命令行的位置没有规定,只是习惯放在前面;在源文件中的可以有多条预处理命令,但一行只能写一条;宏名的大写只是习惯性的表示;宏替换不仅不占用运行时间还不分配内存空间。 f e o f函数的作用是检查文件是否结朿,当结束时返回 11. 的值为非零,否则为零。 12.当定义了数组后,在给其赋值时,不能直接把字符串赋给数组名。 13.在赋值表达式屮,赋值运算符右侧不能为表达式;在求余运算符中的两侧都必须为整型;在强制类型转换时,类型名应用括号括起来。 14.静态局部变量,只有当程序结束后,其值才释放。 15.当调用函数时,实参是一个数组名,则向函数传送的是数组每一个元素的地址。 16.算法的特点为有零个或多个输入,有一个或多个输出,当相同的输入时,其结果相同;算法正确的程序最终一定会结束。 17.! 在C语言中,预处理命令行都以开头;当需要时才用 #include c语言文件读写 从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种。 ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。ASCII码文件可在屏幕上按字符显示。 二进制文件是按二进制的编码方式来存放文件的。二进制文件虽然也可在屏幕上显示,但其内容无法读懂。 C系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。因此也把这种文件称作“流式文件”。 1、文件的打开与关闭 文件在进行读写操作之前要先打开,使用完毕要关闭。所谓打开文件,实际上是建立文件的各种有关信息,并使文件指针指向该文件,以便进行其它操作。关闭文件则断开指针与文件之间的联系,也就禁止再对该文件进行操作。 在C语言中,文件操作都是由库函数来完成的。在本章内将介绍主要的文件操作函数。 在stdio.h文件中,有结构体类型FILE。 typeof struct { short level; /*缓冲区“满”或“空”的程度*/ unsigned flags; /*文件状态标志*/ char fd; /*文件描述符*/ unsigned char hold; /*如无缓冲区不读取字符*/ short bsize; /*缓冲区的大小*/ unsigned char *buffer; /*数据缓冲区的位置*/ unsigned ar *curp; /*指针、当前的指向*/ unsigned istemp; /*临时文件、指示器*/ short token; /*用于有效性检查*/ } FILE; 可以定义文件类型数组,例如:FILE f[5]; 可以定义文件类型指针,例如:FILE *fp;——fp指向某一个文件的结构体变量。 如果有n个文件,一般应设n个指针变量,使它们分别指向n个文件,以实现对文件的访问。 1.1 文件的打开(fopen函数) fopen()函数用来打开一个文件,其调用的一般形式为: 文件指针名=fopen(文件名,使用文件方式); 其中,“文件指针名”必须是被说明为FILE 类型的指针变量; 函数fgets和fputs、fread和fwrite、fscanf和fprintf用法小结 字符串读写函数fgets和fputs 一、读字符串函数fgets函数的功能是从指定的文件中读一个字符串到字符数组中,函数调用的形式为:fgets(字符数组名,n,文件指针);其中的n是一个正整数。表示从文件中读出的字符串不超过n-1个字符。在读入的最后一个字符后加上串结束标志'\0'。例如:fgets(str,n,fp);的意义是从fp所指的文件中读出n-1个字符送入字符数组str中。 [例10.4]从e10_1.c文件中读入一个含10个字符的字符串。 #include 第一周 int定义整型变量所有字母都要先定义再使用。 算法:描述完成任务的步骤序列。 算法的三个基本结构:顺序、分支、循环。 算法的表示:自然语言、程序流图、N-S图 程序流图中判定框用菱形,开始结束用圆角矩形,赋值用矩形。 main:主函数,后面一定是英文输入法下的() int:定义“整形变量” printf:输出语句 scanf:输入语句 %:占位符一个占位符就是占据一个字符的位置,格式化输出时显示为个空格.具体用法如下: %a,%A读入一个浮点值(仅C99有效) %c读入一个字符 %d读入十进制整数 %i读入十进制,八进制,十六进制整数 %o读入八进制整数%x,%X读入十六进制整数 %s读入一个字符串,遇空格、制表符或换行符结束。 %f, %F, %e, %E, %g, %G用來输入实数,可以用小数形式或指数形式输入。 %P读入一个指针 %u读入一个无符号十进制整数 %n至此己读入值的等价字符数 %[]扫描字符集合 %%读%符号(c此内容来自baidu) &:“取地址”运算符:这个运算发可以这样理解,比如说&a的含义就是a在内存中的地址。因为&运算符能够取出一个变量在内存中的地址,所以叫做取地址运算符。 输入语句scanf ("%d %d", &a, &b); 输出语句printf c); 输出内容由“”引出 注意一个;就是一个语句,每句话后都要有分号,不能丢。括号是英文的, 一个程序主要由顺序分支循环3种结构构成 { }不能忘,限制变量作用范围 进入CodeBlocks之后新建一个项目,在project选项中选择控制台应用程序Console application 1S彳亍编写。 输入语句scanf和输出语句printf中的"f ”指的是format格式。 程序编写完成后点击Build ---- Build and run或F9进行运行,并可点击 Vie ---- log看到编程日志,检查错误。 分号;不能少 P. S.如果觉得编写过程中字符显示太小可以按住Ctrl并将鼠标滚轮向下滚來放大〜 第二周 计算一元二次方程的根的题目中,遵守四则运算法则,求根公式.../2a中的2a 要用()括起來 华氏温标(Fahrenheit temperature scale )符号°F , 1724年,徳国人华伦海特制定了华氏温标,他把一定浓度的盐水凝固时的温度定为0°F,把纯水凝固时的温度定为32 °F,把标准大气压下水沸腾的温度定为212T,中间分为180等份,每一等份代表1度,这就是华氏温标,用符号F表示,这就是华氏温度 摄氏温度(°C)和华氏温度(°F)之间的换算关系为: 华氏度(°F)二32+摄氏度CC)X1.8,摄氏度(°C)二(华氏度(°F)-32)一1.8。C语言-文件
《C语言程序设计》第十章文件
C语言-23-
C语言文件操作函数大全
c语言入门教程
Win32FILE--operator
c语言基础教程-第十章------文件和读写函数
c语言调用其他文件函数的方法 -回复
c语言标准函数获取文件名 -回复
fopen函数打开的用法
c语言拷贝文件函数 -回复
C语言学习笔记-详细而全面的基础教程
C语言基础知识归纳-c语言基础知识入门
c语言文件读写
函数fgets和fputs、fread和fwrite、fscanf和fprintf用法小结
c语言基础知识及考点整理解读