C语言_函数嵌套_指针_文件
C语言文件操作函数大全
C语言文件操作函数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调用fgetc和fputc函数进行输入和输出1,调用fputc函数输出一个字符功能是:将字符ch写到文件指针fp所指的文件中去.当输出成功,putc函数返回所输出的字符;否则,返回一个EOF值.EOF是在stdio.h库函数文件中定义的符号常量,其值等于-1.13.5调用fgetc和fputc函数进行输入和输出例如:把从键盘输入的文本按原样输出到名为file_1.dat文件中,用字符@作为键盘输入结束标志. #includeVoid 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.调用fgetc函数输入一个字符功能是:从pf指定的文件中读如一个字符,并把它作为函数值返回.例如:把一个已存在磁盘上的file_1.dat文本文件中的内容,原样输出到终端屏幕上.#includevoid 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判断文件结束函数feofEOF可以作为文本文件的结束标志,但不能作为二进制文件的结束符.feof函数既可以判断二进制文件,又可以判断文本文件.例:编写程序,用于把一个文本文件(源)复制到另一个文件(目的)中,源文件名和目的文件名由命令行输入.命令形式如下:可执行程序名源文件名目的文件名#includevoid filecopy(FILE* ,FILE *);void main(int argc,char *argv[]){FILE *fpin,*fpout;if(argc==3){ fpin=fopen(argv[1],"r");fpout=fopen(argv[2],"w");filecopy(fpin,fpout);fclose(fpin);fclose(fpout);}else if(argc>3)printf("The file names too many!!\n";elseprintf("There are no file names for input or output!!\n );}void filecopy(FILE *fpin,FILE *fpout){char ch;ch=getc(fpin);while(!feof(fpin)){putc(ch,fpout); ch=getc(fpin);}}13.7fscanf函数和fprintf函数1,fscanf函数fscanf只能从文本文件中按格式输入,和scanf函数相似,只不过输入的对象是磁盘上文本文件中的数据.调用形式为:fscanf(文件指针,格式控制字符串,输入项表)例如:fscanf(fp,"%d%d",&a,&b);fscanf(stdin,"%d%d",&a,&b);等价于scanf("%d%d",&a,&b);3.fprintf函数fprintf函数按格式将内存中的数据转换成对应的字符,并以ASCII代码形式输出到文本文件中.Fprintf 函数和printf函数相似,只是将输出的内容按格式存放到磁盘的文本文件中.调用形式如下:fprintf(文件指针,格式控制字符串,输出项表)如:fprintf(fp,"%d %d",x,y);以下语句 fprintf(stdout,"%d %d",x,y)13.8fgets函数和fputs函数1,fgets函数fgets函数用来从文件中读入字符串.调用形式如下: fgets(str,n,fp);函数功能是:从fp所指文件中读入n-1个字符放入str 为起始地址的空间内;如果在未读满n-1个字符时,则遇到换行符或一个EOF结束本次读操作,并已str作为函数值返回. 13.8fgets函数和fputs函数2,fputs函数fput函数把字符串输出到文件中.函数调用形式如下: fputs(str,fp);注意:为了便于读入,在输出字符串时,应当人为的加诸如"\n"这样的字符串.#include <stdio.h>#include <iostream>int main(int argc, char *argv[]){char arr[10] ;char *ap = "hello!" ;FILE *fp ;if ((fp = fopen("hello.txt", "wt+")) == NULL) {printf("error!") ;exit(1) ;}fputs(ap, fp) ;rewind(fp) ; //fgets(arr, 10, fp) ;printf("%s\n", arr) ;fclose(fp) ;return 0 ;}13.9fread函数和fwrite函数例如有如下结构体:struct st{char num[8];float mk[5];}pers[30];以下循环将把这30个元素中的数据输出到fp所指文件中.for(i=0;i<30;i++)fwrite(&pers[i],sizeof(struct st),1,fp);13.9fread函数和fwrite函数以下语句从fp所指的文件中再次将每个学生数据逐个读入到pers数组中.i=0;fread(&pers[i],sizeof(struct st),1,fp);while(!feof(fp)){ i++;fread(&pers[i],sizeof(struct st),1,fp);}13.10文件定位函数1,fseek函数fseek函数用来移动文件位置指针到指定的位置上,接着的读或写操作将从此位置开始.函数的调用形式如下:fseek(pf,offset,origin)pf:文件指针offset:以字节为单位的位移量,为长整形.origin:是起始点,用来指定位移量是以哪个位置为基准的.1,fseek函数位移量的表示方法标识符数字代表的起始点SEEK_SET 0 文件开始SEEK_END 2 文件末尾SEEK_CUR 1 文件当前位置假设pf已指向一个二进制文件,则;fseek(pf,30L,SEEK_SET)fseek(pf,-10L*sizeof(int),SEEK_END)对于文本文件,位移量必须是0;如:fseek(pf,0L,SEEK_SET)fseek(pf,0L,SEEK_END)2. ftell函数ftell函数用以获得文件当前位置指针的位置,函数给出当前位置指针相对于文件开头的字节数.如;long t;t=ftell(pf);当函数调用出错时,函数返回-1L.我们可以通过以下方式来测试一个文件的长度: fseek(fp,0L,SEEK_END);t=ftell(fp);3.rewind函数调用形式为:rewind(pf);函数没有返回值.函数的功能是使文件的位置指针回到文件的开头.13.10文件应用在磁盘上的test.txt文件中放有10个不小于2的正整数,用函数调用方式编写程序.要求实现:1,在被调函数prime中,判断和统计10个整数中的素数以及个数.2,在主函数中将全部素数追加到磁盘文件test.txt的尾部,同时输出到屏幕上.#include#includeInt prime(int a[],int n){int I,j,k=0,flag=0;for(i=0;i { for(j=2;j if(a[i]%j==0){ flag=0; break;}else flag=1;if(flag){a[k]=a[i];k++;}}return k; }void main(){int n,I,a[10];FILE *fp;fp=fopen("test1-2.txt","r+");for(n=0;n<10;n++)fscanf(fp,"%d",&a[n]);n=prime(a,n);fseek(fp,o,2);for(i=0;i {printf("%3d",a[i]);fprintf(fp,"%3d",a[i]);}fclose(fp);}文件操作函数全clearerr(清除文件流的错误旗标)相关函数feof表头文件#include<stdio.h>定义函数void clearerr(FILE * stream);函数说明clearerr()清除参数stream指定的文件流所使用的错误旗标。
《C语言程序设计》基本知识点
《C语言程序设计》基本知识点第一章C语言基本知识1.C源程序的框架尽管各个C源程序的功能千变万化,但框架是不变的,主要有:编译预处理、主函数()、函数n()等,主函数的位置不一定在最前面,可以在程序的中部或后面,主函数的名字固定为main。
2.C语言源程序的书写规则:(1)C源程序是由一个主函数和若干个其它函数组成的。
(2)函数名后必须有小括号,函数体放在大括号内。
(3)C程序必须用小写字母书写。
(4)每句的末尾加分号。
(5)可以一行多句。
(6)可以一句多行。
(7)可以在程序的任何位置加注释。
3.语句种类语句是程序的基本成分,程序的执行就是通过一条条语句的执行而得以实现的,根据表现形式及功能的不同,C语言的基本语句可以分为五大类。
(1)流程控制语句流程控制语句的功能是控制程序的走向,程序的流程有三种基本结构:顺序结构、分支结构和循环结构,任何复杂的程序都可以由这三种基本结构复合而成。
其中后两种结构要用特定的流程控制语句实现。
(2)表达式语句表达式语句的形式是:表达式;,即表达式后跟一分号“;”,分号是语句结束符,是一个语句必不可少的成分。
表达式和表达式语句的区别在于表达式代表的是一个数值,而表达式语句则代表一种动作。
最常见的表达式语句是赋值语句。
(3)函数调用语句函数调用语句实际上也是一种表达式语句,形式为:在一次函数调用的小括号后面加上一个分号。
(4)空语句空语句的形式就是一个分号,它不代表任何动作,常常作为一个意义转折点使用。
(5)复合语句复合语句从形式上看是多个语句的组合,但在语法意义上它只相当于一个语句,在任何单一语句存在的地方都可以是复合语句。
注意复合语句中最后一个语句末尾的分号不能少。
复合语句右大括号后面没有分号。
4.运算符用来表示数据各种操作的符号称为运算符。
运算符实际上代表了一种类型数据的运算规则。
不同的运算符具有不同的运算规则,其操作的数据类型必须符合该运算符的要求,运算结果的数据类型也是固定的。
全国计算机等级考试三级上级C语言教程——函数,结构体,指针
第44套(同类型题69) 44套 同类型题69) 69
在数据文件in.dat中有200组数据, 每组有3个数, 在数据文件in.dat中有200组数据, 每组有3个数, 每个 in.dat中有200组数据 数均是三位数。函数readDat()是读取这200 readDat()是读取这200组数据存放 数均是三位数。函数readDat()是读取这200组数据存放 到结构数组aa aa中 请编制函数jsSort(), 到结构数组aa中。请编制函数jsSort(), 其函数的功能 要求在200组数据中找出条件为每组数据中的第一个 200组数据中 是:要求在200组数据中找出条件为每组数据中的第一个 数大于第二个数与第三个数之和, 数大于第二个数与第三个数之和, 其中满足条件的个数 作为函数jsSort()的返回值, 同时把满足条件的数据存 jsSort()的返回值 作为函数jsSort()的返回值, 同时把满足条件的数据存 入结构数组bb bb中 再对bb bb中的数据按照每组数据的第一 入结构数组bb中, 再对bb中的数据按照每组数据的第一 个数与第三个数之和的大小进行升序排列( 个数与第三个数之和的大小进行升序排列(第一个数与 第三个数的和均不相等), 第三个数的和均不相等), 排序后的结果仍重新存入结 构数组bb bb中 最后调用函数writeDat()把结果bb writeDat()把结果bb输出到 构数组bb中,最后调用函数writeDat()把结果bb输出到 out.dat文件中 文件中。 out.dat文件中。
Strcmp举例 Strcmp举例
#include<string.h> #include<stdio.h> void main() { char * s1="hello Programmers!"; char * s2="hello programmers!"; int r; r=strcmp(s1,s2); if(!r) printf("s1 and s2 are identical"); else if(r<0) printf("s1 is less than s2"); else printf("s1 is greater than s2"); }
C语言易错点考点(完整版)
总体上必须清楚的:1)程序结构是三种:顺序结构,循环结构(三个循环结构),选择结构(if和switch)2)用C语言编写的程序称为C语言源程序,源程序文件的后缀名为“.c”;源程序经编译后生成后缀名为“.obj”的目标文件;再把目标文件与各种库函数连接起来,生成“.exe”的可执行文件。
3)main函数,又称主函数,每个C程序有且只有一个main函数;无论main函数在整个程序中的位置如何,程序总是从main函数开始执行、也从main函数结束。
读程序时应从main 函数开始,然后从上往下读(碰到循环做循环,碰到选择做选择)。
4)计算机的数据在电脑中保存是以二进制的形式.数据存放的位置就是他的地址.5)bit是位是指为0或者1。
byte是指字节,一个字节=八个位.6)一定要记住二进制如何划成十进制。
概念常考到的:1、编译预处理不是C语言的一部分,不占运行时间,不要加分号。
C语言编译的程序称为源程序,它以ASCⅡ数值存放在文本文件中。
2、每个C语言程序中main函数是有且只有一个。
3、在函数定义中不可以再定义函数、即不允许函数嵌套定义。
4、算法可以没有输入,必须要有输出。
5、break可用于循环结构和switch语句。
6、逗号运算符的级别最低。
7、任意合法的表达式一定有一个数值与它对应。
第一章1)C程序中对字母的大小写是敏感的,如A与a是不同的标识符。
注释:是对程序的说明,目的是提高程序的可读性,可出现在程序中任意合适的地方,注释从“/*”开始到最近一个“*/”结束,其间任何内容都不会被计算机执行,不允许嵌套注释。
3)合法的用户标识符考查:合法的要求是由字母,数字,下划线组成。
有其它元素就错了。
并且第一个必须为字母或则是下划线。
第一个为数字就错了。
关键字不可以作为用户标识符号。
main define scanf printf都不是关键字。
迷惑你的地方If 是可以做为用户标识符。
因为If中的第一个字母大写了,所以不是关键字。
《C语言与程序设计》实验06---函数
实验六函数一、实验目的1. 熟练掌握函数的定义、函数的类型和返回值。
2. 熟练掌握形式参数与实际参数、参数值的传递。
3. 掌握函数的嵌套调用与递归调用。
4.学会使用指向函数的指针变量。
5.了解指向指针的指针的概念及带参数的main函数。
6. 掌握局部变量和全局变量。
7. 掌握变量的存储类型。
8. 了解内部函数和外部函数。
二、实验学时:8课时三、预习知识1.标准库函数标准库函数是C系统提供的,这些库函数定义了一些基本的、常用的功能,用户可以使用这些库函数,但是在使用库函数之前需要用预编译命令# include将该库函数所在的头文件包含进来。
2.自定义函数定义函数一般有两种形式形式1:存储类型类型符函数名(类型符形参1,类型符形参2 ,… ) { 说明语句执行语句}形式2:存储类型类型符函数名(形参1,形参2 ,……)形参类型说明{ 说明语句执行语句}说明:①形参表中即使没有参数,函数名后的一对圆括号也不能省略。
②函数名前的类型符是用来说明函数返回值的数据类型(也作为函数的数据类型) 。
当函数值为整型时,类型符可以省略。
③当函数只完成某一特定操作不需要返回值时,可用类型标识符 void 说明,将函数定义成空类型。
④C 规定:不允许在一个函数内部再定义另外一个函数,即函数不允许嵌套定义。
⑤函数的存储类型:函数的存储类型有 extern 和 static 两种。
extern 型的函数除了可以被本程序中其它函数调用外,还可以被其它文件中的函数调用,这种函数称为外部函数,如果定义函数时省略 extern ,则隐含为外部函数。
static 型的函数只能被本源程序文件中的函数调用,称为内部函数(静态函数)。
3.函数的参数(1)在定义函数时函数名后面括号中的变量称为形参(形式参数),如果有两个以上形参,形参之间以逗号分隔。
形参是函数的内部变量,只在函数内部才有意义。
在未出现函数调用时,形参不占内存。
对每个形参必须指明其名字和数据类型。
c语言函数嵌套
c语言函数嵌套摘要:1.函数嵌套的概念2.函数嵌套的分类3.函数嵌套的实例4.函数嵌套的注意事项正文:C 语言函数嵌套是指在一个函数中调用另一个函数。
这种技术可以实现代码的模块化,使程序更加清晰易懂。
函数嵌套可以分为两类:递归函数和非递归函数。
递归函数是指一个函数在其定义中调用自身。
递归函数通常用于解决具有相似子问题的复杂问题。
例如,计算阶乘的函数就是一个典型的递归函数。
非递归函数是指一个函数在其定义中调用其他函数,而不是调用自身。
这类函数通常用于实现一些具体的功能。
下面是一个函数嵌套的实例。
假设我们需要计算一个数的阶乘,我们可以编写一个递归函数来实现:```c#include <stdio.h>int factorial(int n) {if (n == 1) {return 1;} else {return n * factorial(n - 1);}}int main() {int num;printf("请输入一个正整数:");scanf("%d", &num);printf("数%d的阶乘为:%d", num, factorial(num));return 0;}```在这个例子中,我们定义了一个名为`factorial`的递归函数,用于计算一个数的阶乘。
在`main`函数中,我们调用`factorial`函数来计算用户输入的数的阶乘,并将结果输出。
在使用函数嵌套时,需要注意以下几点:1.确保调用的函数已经定义。
如果调用的函数在当前文件中定义,那么需要在调用函数之前包含该文件。
如果调用的函数在其他文件中定义,那么需要使用`#include`指令包含该文件。
2.确保调用的函数与被调用的函数具有相同的返回类型。
如果返回类型不匹配,需要使用类型转换来解决。
3.避免无限递归。
无限递归会导致程序陷入死循环,导致栈溢出。
C语言文件操作函数大全
C语言文件操作函数大全1. `fopen`:打开文件```FILE* fopen(const char* filename, const char* mode);```该函数用于打开一个文件,成功打开返回文件指针,打开失败返回`NULL`。
`filename` 是要打开的文件名,`mode` 是打开模式,常用的模式有 "r"(只读)、"w"(可写,若文件不存在则创建新文件)、"a"(追加模式)。
2. `fclose`:关闭文件```int fclose(FILE* stream);```该函数用于关闭一个文件,成功关闭返回0,关闭失败返回 `EOF`。
`stream` 是要关闭的文件指针。
3. `fread`:读取文件内容```size_t fread(void* ptr, size_t size, size_t count, FILE* stream);```该函数从文件中读取内容,存储到指定的内存块。
`ptr` 是指向要读取数据的内存块的指针,`size` 是每个数据项的大小,`count` 是要读取的数据项数目。
4. `fwrite`:写入文件内容```size_t fwrite(const void* ptr, size_t size, size_t count, FILE* stream);```该函数将指定的内存块内容写入文件。
`ptr` 是指向要写入数据的内存块的指针,`size` 是每个数据项的大小,`count` 是要写入的数据项数目。
5. `fgetc`:读取一个字符```int fgetc(FILE* stream);```该函数从文件中读取一个字符,成功读取返回字符对应的整数值,读取失败或到达文件末尾返回`EOF`。
6. `fputc`:写入一个字符```int fputc(int c, FILE* stream);```该函数将一个字符写入文件,成功写入返回写入的字符,写入失败返回`EOF`。
c语言函数嵌套
c语言函数嵌套(原创版)目录1.C 语言函数嵌套的概念2.函数嵌套的实现方式3.函数嵌套的注意事项4.函数嵌套的实例解析正文C 语言函数嵌套是指在一个函数中调用另一个函数。
这种技术可以实现代码的模块化和复用,使得程序的设计更加简洁和清晰。
在 C 语言中,函数嵌套可以通过返回值和参数来实现。
首先,让我们了解一下函数嵌套的实现方式。
在 C 语言中,可以通过在函数内部调用另一个函数来实现函数嵌套。
被调用的函数可以是自定义的函数,也可以是系统提供的标准库函数。
调用方式和使用普通函数一样,只是在函数内部进行调用。
其次,函数嵌套的注意事项。
在使用函数嵌套时,应当避免函数调用过深,以免导致程序运行效率降低。
同时,应当注意函数嵌套可能会引发的递归调用过深问题。
如果发现函数嵌套过于复杂,可以考虑使用其他设计模式,如模块化或结构体等。
接下来,我们通过一个实例来解析函数嵌套。
假设我们需要计算一个矩形的面积和周长,可以定义两个函数分别计算面积和周长。
在计算面积的函数中,我们需要知道矩形的长和宽,而这两个参数可以通过用户输入或其他方式获取。
下面是一个简单的函数嵌套实例:```c#include <stdio.h>// 获取用户输入的矩形长和宽void getDimensions(double *length, double *width) {printf("请输入矩形的长:");scanf("%lf", length);printf("请输入矩形的宽:");scanf("%lf", width);}// 计算矩形的面积double calculateArea(double length, double width) {return length * width;}// 计算矩形的周长double calculatePerimeter(double length, double width) { return 2 * (length + width);}int main() {double length, width;getDimensions(&length, &width);double area = calculateArea(length, width);double perimeter = calculatePerimeter(length, width); printf("矩形的面积为:%.2lf", area);printf("矩形的周长为:%.2lf", perimeter);return 0;}```在上面的代码中,我们定义了一个`getDimensions`函数来获取用户输入的矩形长和宽,然后分别调用`calculateArea`和`calculatePerimeter`函数计算矩形的面积和周长。
C语言小结x
十七、 十七、文
件
1、关于输入输出的概念
主机 运算器 输入设备
输入
控制器 内存储器
输入 读 输出 写
输出
输出设备
外存储器
2、文件的建立与读取 、 (1)数据文件的建立步骤:(设有 FILE *fp;) • fp=fopen(“文件名”,“写方式”); • 反复写;( fputc(ch,fp); fputs(str,fp); putw(i,fp);
2001 2002 2003 2004
c n v
注意: 注意:共用体类型变量每次只能存放一个成员的 值。
十五、 十五、 枚举类型
枚举类型的定义 enum 枚举类型名 标识符 ,标识符 }; 枚举类型名{ 标识符[ 标识符 ; 标识符]
例如: 例如:
其中的标识符称为枚举常量
enum weekday {sun,mon,tue,wed,thu,fri,sat} ;
函
数
名
十、指针变量
指针类型 指向变量的指针变量 指向数组元素的指针变量 指向字符串的指针变量 指向一维数组的指针变量 指针数组 指向指针的指针 指向函数的指针变量 返回指针值的函数 定义形式 备 注
int *p; int a[10]; int b[3][4]; int*p=a, *q=b; char *p=“Beijing”; int (*p)[4]; int *p[4]; int **p; int (*p)( ); int *p(x,y)
返回到主调函数有关函数 调用语句之后
计算 一个 值
char int float ……
表达式形式: 表达式形式: 例如: x=max(a,b);
返回到主调函数表达式转 出处
c语言试题卷
一、选择题1. 以下关于C语言的说法中,错误的是( )。
A. C语言区分大小写B. C语言中的变量必须先定义后使用C. C语言程序的执行入口是main()函数D. C语言程序中可以没有main()函数2. 在C语言中,表达式x%3的结果是( )。
A. x除以3的商B. x除以3的余数C. x除以3的倒数D. x除以3的结果3. 在C语言中,关于数组的说法错误的是( )。
A. 数组是一组相同类型的数据的集合B. 数组的下标从0开始C. 数组在定义时必须指定大小D. 数组可以在使用时动态改变大小二、判断题1. C语言中的函数可以嵌套定义。
( )2. C语言支持面向对象编程。
( )3. C语言中的指针变量存储的是内存地址。
( )三、填空题1. C语言的三种基本结构是顺序结构、__________和__________。
2. C语言中,字符串常量必须用__________括起来。
3. C语言中,文件操作需要包含头文件__________。
四、编程题1. 编写一个程序,输入一个整数n,计算并输出1+2+3+...+n的值。
2. 编写一个程序,输入一个字符串,将其中的大写字母转换为小写字母,小写字母转换为大写字母,其他字符不变,并输出转换后的字符串。
3. 编写一个程序,实现两个整数的加、减、乘、除运算,要求使用函数实现。
4. 编写一个程序,实现冒泡排序算法,对一个整数数组进行升序排序。
5. 编写一个程序,实现文件的读写操作。
要求从键盘输入一些数据,写入到文件中,然后再从文件中读取数据并输出到屏幕上。
C语言各章节知识点总结
C语言各章节知识点总结C语言是一种通用的高级编程语言,广泛应用于计算机软件开发。
下面是C语言各章节的知识点总结:第一章:C语言简介-C语言起源和发展-C语言的特点和优势-C语言的应用领域-C语言的编译和执行过程-编写第一个C语言程序第二章:C语言基础-C语言的基本数据类型-变量和常量-运算符和表达式- 控制语句(if语句、switch语句、for循环、while循环)-输入和输出-函数的定义和调用第三章:C语言数组-数组的定义和初始化-一维数组和多维数组-数组的应用(排序、查找、统计)- 字符串处理函数(strlen、strcpy、strcat)-字符串的输入和输出第四章:C语言指针-指针的概念和作用-指针变量和指针的运算-指针和数组的关系-指针作为函数参数-动态内存分配第五章:C语言函数高级特性-递归函数-函数指针和回调函数-变量的作用域和存储类别-预处理指令-多文件程序设计第六章:C语言结构体和共用体-结构体的定义和初始化-结构体的嵌套和数组-共用体的定义和应用-枚举类型的定义和使用- typedef的使用第七章:C语言文件处理-文件的概念和分类-文件的打开和关闭-文件的读取和写入-文件的定位和修改-错误处理和异常处理第八章:C语言位运算和位字段-位运算的概念和操作-位掩码和位移操作-位字段的定义和使用-位字段的对齐和优化-位操作的应用第九章:C语言高级编程技术-内存管理和动态内存分配-系统调用和库函数的使用-异常处理和错误处理-多线程编程和进程间通信-嵌入式系统开发技术总结:C语言是一门基础且强大的编程语言,掌握C语言的各章节知识点对于学习和使用C语言是非常重要的。
掌握C语言基础知识可以编写简单的程序,掌握指针和数组等知识可以处理更加复杂的数据结构和算法,掌握高级特性可以编写更加高效和模块化的程序。
通过学习C语言,可以为后续学习其他编程语言打下坚实的基础。
c语言文件指针的偏移量
c语言文件指针的偏移量在C语言中,文件指针是一种特殊的指针类型,用于在文件中进行读写操作。
文件指针的偏移量是指文件指针相对于文件开头的位置。
通过改变文件指针的偏移量,我们可以在文件中定位到不同的位置,从而实现对文件的灵活操作。
C语言中,文件指针的偏移量可以通过以下两种方式进行设置:相对于文件开头的偏移量和相对于当前位置的偏移量。
相对于文件开头的偏移量可以通过函数fseek()来设置。
fseek()函数的原型如下:int fseek(FILE *stream, long offset, int origin);其中,stream是指向文件的指针,offset是偏移量,origin是偏移的起始位置。
origin可以取以下三个值:- SEEK_SET:从文件开头开始偏移- SEEK_CUR:从当前位置开始偏移- SEEK_END:从文件末尾开始偏移例如,我们可以使用fseek()函数将文件指针定位到文件开头:fseek(fp, 0, SEEK_SET);这样,文件指针的偏移量就被设置为0,即指向文件开头。
相对于当前位置的偏移量可以通过函数fseek()的返回值来设置。
fseek()函数返回0表示成功,返回非0值表示失败。
我们可以利用这个返回值来判断文件指针的偏移量是否设置成功。
另外,C语言还提供了函数ftell()来获取文件指针的当前偏移量。
ftell()函数的原型如下:long ftell(FILE *stream);其中,stream是指向文件的指针。
ftell()函数返回文件指针的当前偏移量。
通过文件指针的偏移量,我们可以实现对文件的灵活读写操作。
例如,我们可以使用fseek()函数将文件指针定位到文件末尾,然后使用fwrite()函数向文件中写入数据:fseek(fp, 0, SEEK_END);fwrite(data, sizeof(char), strlen(data), fp);这样,数据就会被写入到文件的末尾。
c语言与程序设计
c语言与程序设计C语言与程序设计介绍C语言C语言是一种通用的编程语言,它最初由贝尔实验室的Dennis Ritchie于1972年开发。
C语言是一种高级语言,具有可移植性和灵活性。
它可以用于开发操作系统、编写应用程序和驱动程序等。
C语言的特点1. 结构化编程:C语言支持结构化编程,这意味着程序员可以使用函数、变量和控制结构来组织代码。
2. 高效性:C语言是一种高效的编程语言,因为它可以直接访问计算机硬件,并且不需要中间层来解释代码。
3. 可移植性:C语言是一种可移植的编程语言,因为它可以在不同类型的计算机上运行。
4. 丰富的库函数:C标准库提供了大量的函数,包括输入/输出、字符串处理、数学计算等功能。
5. 简洁明了:C语言具有简洁明了的代码结构,使得程序员可以更容易地理解和修改代码。
6. 面向过程:C语言是面向过程的编程语言,这意味着程序员需要按照顺序执行代码来完成任务。
基本数据类型1. int型:表示整数,通常占用4个字节。
2. float型:表示单精度浮点数,通常占用4个字节。
3. double型:表示双精度浮点数,通常占用8个字节。
4. char型:表示字符,通常占用1个字节。
变量和常量变量是在程序中存储值的容器。
在C语言中,变量必须在使用之前先声明。
声明变量时需要指定数据类型和名称。
常量是程序中不会改变的值。
在C语言中,可以使用#define或const关键字来定义常量。
#define指令将标识符定义为一个常量值,而const关键字定义一个只读变量。
运算符1. 算术运算符:+、-、*、/、%(取模)2. 关系运算符:==、!=、>、<、>=、<=3. 逻辑运算符:&&(与)、||(或)、!(非)4. 位运算符:&(按位与)、|(按位或)、^(按位异或)、~(按位取反)、<<(左移)、>>(右移)5. 赋值运算符:=、+=、-=、*=、/=、%=等控制结构1. if语句:当条件为真时执行代码块。
C语言程序设计判断题
顺序结构、选择结构和循环结构可以组成所有的各种复杂程序。
对复合语句就是多余语句,不必用花括号括起来。
错在变量声明中,允许连续给多个变量赋初值。
如:int a = b = c = 1;错scanf函数和printf函数的原型在头文件stdio.h中。
对printf函数格式字符串中%4d表示输出一定是四位十进制整数。
错putchar函数的功能是在显示器上输出一个字符。
对在scanf函数的格式说明中,如果是"%d%d%d",在输入三个十进制整数时可以用空格、回车或Tab键作为每两个输入数之间的间隔。
对在scanf函数的格式说明中,如果是"%c%c%c",在输入三个字符时要用空格、回车或Tab键作为每两个输入数之间的间隔。
错scanf("%5.2f", &a);是合法的,目的是输入小数为两位的实数。
错getchar函数的功能是从显示器输入一个字符。
错关系表达式的值是“真”和“假”,用T和F表示。
错关系表达式3 > 2 > 1的值为真。
错if (表达式)语句1;else语句2;其语义是:如果表达式的值为真,则执行语句1,否则执行语句2对在if关键字之后均为表达式。
该表达式可以是任意表达式,但不能是变量。
错当程序中有多个if和else时,它们是按照顺序配对的。
如第一个if 与第一个else配对,第二个if与第二个else配对,以此类推。
错在switch多分支语句中,break语句用于跳出switch语句。
对switch多分支语句中必须包含default分支。
错“当型”循环是先判断表达式后执行循环体,“直到型”循环是先执行循环体后判断表达式。
对如果循环体内包含一个以上的语句,应该用花括号括起来,组成复合语句。
对do...while语句和while语句可以直接互换,运行结果相同。
错for(循环变量赋初值; 循环条件; 循环变量增量)中的循环条件不允许省略。
c语言函数嵌套
C语言函数嵌套1. 什么是函数嵌套?函数嵌套是指在一个函数内部调用另一个函数。
在C语言中,函数嵌套可以有效地组织和管理代码,提高代码的重用性和可读性。
2. 函数嵌套的优点函数嵌套有以下几个优点:•模块化编程:函数嵌套可以将复杂的问题分解为多个小的子问题,每个子问题由一个函数来解决,从而提高了代码的可读性和可维护性。
•代码重用:函数嵌套可以将常用的代码封装成函数,可以在不同的地方多次调用,避免了重复编写相同的代码。
•层次清晰:函数嵌套可以将代码按照层次结构组织起来,使得代码逻辑更加清晰明了,易于理解和调试。
3. 函数嵌套的实现方式函数嵌套可以通过在一个函数内部直接调用另一个函数来实现。
在C语言中,函数的定义和调用顺序是有要求的,所以在函数嵌套时需要注意以下几点:•函数的定义顺序:被调用的函数必须在调用它的函数之前定义。
•函数的声明:如果函数的定义在调用它的函数之后,可以在调用之前进行函数的声明,以告知编译器该函数的存在。
•函数的返回值类型和参数列表:被调用的函数的返回值类型和参数列表必须与调用它的函数的函数原型或函数声明中的参数类型和个数一致。
4. 函数嵌套的示例下面是一个简单的示例,演示了函数嵌套的用法:#include <stdio.h>// 声明被调用的函数int add(int a, int b);// 定义调用的函数void printSum(int a, int b);int main() {int num1 = 10;int num2 = 20;printSum(num1, num2);return 0;}// 定义被调用的函数int add(int a, int b) {return a + b;}// 定义调用的函数void printSum(int a, int b) {int sum = add(a, b);printf("The sum of %d and %d is %d\n", a, b, sum);}在上面的示例中,printSum函数调用了add函数,实现了对两个数的求和并打印结果。
c语言函数嵌套
c语言函数嵌套摘要:一、C语言函数简介1.函数定义与调用2.函数参数传递3.函数返回值二、函数嵌套的概念1.内层函数与外层函数2.嵌套函数的调用关系3.嵌套函数的参数传递三、C语言函数嵌套的应用1.递归函数2.队列与栈数据结构3.其他实际应用场景四、函数嵌套的注意事项1.函数嵌套的深度限制2.函数嵌套与程序可读性3.函数嵌套与程序性能正文:C语言函数嵌套是C语言中一种常见的编程技巧,它涉及到函数的定义、调用、参数传递等多个方面。
在深入了解函数嵌套之前,我们需要先了解一下C语言函数的基本概念。
函数是C语言中实现代码模块化的重要手段,它允许我们将一段代码定义成一个独立的单元,以便在其他地方调用。
函数定义的基本格式如下:```c返回类型函数名(参数类型参数名) {// 函数体// ...}```在C语言中,函数的调用可以通过关键字`call`或`invoke`实现。
函数参数传递分为值传递和指针传递两种,而函数的返回值则可以通过返回语句实现。
在了解C语言函数的基本概念后,我们来探讨一下函数嵌套的概念。
函数嵌套是指在一个函数内部调用另一个函数,被调用的函数称为内层函数,调用者称为外层函数。
嵌套函数的调用关系可以通过递归实现,也可以通过队列、栈等数据结构实现。
在C语言中,函数嵌套的应用非常广泛。
递归函数是一种典型的函数嵌套应用,它通过将问题分解成规模较小的相似子问题来解决问题。
队列与栈数据结构在实际应用中也经常涉及函数嵌套,例如栈的压入、弹出操作等。
在实际编程过程中,使用函数嵌套需要注意一些问题。
首先,函数嵌套的深度有限制,过深的嵌套可能导致程序难以理解和调试。
其次,函数嵌套可能影响程序的可读性,因此需要合理使用嵌套。
此外,函数嵌套可能影响程序的性能,因此需要在满足需求的前提下尽量减少嵌套层数。
总之,C语言函数嵌套是一种重要的编程技巧,它可以帮助我们实现代码的模块化,提高程序的可读性和性能。
C语言选择题
1.以下C语言用户标识符中,不合法的是 DA)_1B)AaBcC)a_bD)a-b2.以下选项中合法的标识符是 CA)1_1B)1-1C)_11D)1_ _3.以下叙述中正确的是A)C程序的基本组成单位是语句B)C程序中的每一行只能写一条语句C)简单C语句必须以分号结束D)C语句必须在一行内写完4.计算机能直接执行的程序是A)源程序B)目标程序C)汇编程序D)可执行程序5.以下叙述中正确的是A)C程序中的注释只能出现在程序的开始位置和语句的后面B)C程序书写格式严格,要求一行内只能写一个语句C)C程序书写格式自由,一个语句可以写在多行上D)用C语言编写的程序只能放在一个程序文件中6.以下选项中不合法的标识符是 CA)print B)FOR C)&a D)_007.以下选项中,能用作数据常量的是 DA)o115B)0118C)1.5e1.5D)115L8.以下选项中不能作为C语言合法常量的是 AA)'cd'B)0.1e+6C)"\a"D)'\011'9.C源程序中不能表示的数制是 AA)二进制B)八进制C)十进制D)十六进制10.以下不能正确表示代数式2ab/cd的C语言表达式是 DA)2*a*b/c/d B)a*b/c/d*2C)a/c/d*b*2D)2*a*b/c*d11.设有定义:int x=2;,以下表达式中,值不为6的是 DA)x*=x+1B)x++,2*xC)x*=(1+x)D)2*x,x+=212.若有表达式(w)?(--x):(++y),则其中与w等价的表达式是 DA)w==1B)w==0C)w!=1D)w!=0若有定义:double a=22;int i=0,k=18;,则不符合C语言规定的赋值语句是 C A)a=a++,i++;B)i=(a+k)<=(i+k);C)i=a%11;D)i=!a;13.若函数中有定义语句:int k;,则 BA)系统将自动给k赋初值0B)这时k中的值无定义C)系统将自动给k赋初值-1D)这时k中无任何值14.程序段:int x=12; double y=3.141593;printf("%d%8.6f",x,y);的输出结果是 AA)123.141593B)12 3.141593C)12,3.141593D)123.141593015.有以下程序#include<stdio.h>main(){ char a,b,c,d;scanf(“%c%c”,&a,&b);c=getchar(); d=getchar();printf(“%c%c%c%c\n”,a,b,c,d);}当执行程序时,按下列方式输入数据(从第1列开始,<CR>代表回车,注意:回车也是一个字符)12<CR>34<CR>则输出结果是CA)1234B)12C)123D)123416.若变量已正确定义为int型,要通过语句scanf("%d,%d,%d",&a,&b,&c);给a赋值1、给b赋值2、给c赋值3,以下输入形式中错误的是(μ代表一个空格符) BA)μμμ1,2,3<回车>B)1μ2μ3<回车>C)1,μμμ2,μμμ3<回车>D)1,2,3<回车>17.有以下程序#include<stdio.h>main(){int a1,a2;char c1,c2;scanf("%d%c%d%c",&a1,&c1,&a2,&c2);printf("%d,%c,%d,%c",a1,c1,a2,c2);}若通过键盘输入,使得a1的值为12,a2的值为34,c1的值为字符a,c2的值为字符b,程序输出结果是:12,a,34,b 则正确的输入格式是(以下_代表空格,<CR>代表回车) AA)12a34b<CR>B)12_a_34_b<CR>C)12,a,34,b<CR>D)12_a34_b<CR>18.若a是数值类型,则逻辑表达式(a==1)||(a!=1)的值是 AA)1B)0C)2D)不知道a的值,不能确定19.以下程序段中的变量已正确定义for(i=0;i<4;i++,j++)for(k=1;k<3;k++);printf("*");程序段的输出结果是 DA)********B)****C)**D)*20.设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是 DA)n=0;while((ch=getchar())!='\n') n++;B)n=0;while(getchar()!='\n') n++;C)for(n=0;getchar()!='\n';n++);D)n=0;for(ch=getchar();ch!='\n';n++);21.有以下程序 D#include <stdio.h>main(){ int n=2,k=0;while(k++&&n++>2);printf(“%d %d\n”,k,n);}程序运行后的输出结果是A)0 2 B)1 3 C)5 7 D)1 222.有以下程序 B#include<stdio.h>int f(int x,int y){return((y-x)*x);}main(){int a=3,b=4,c=5,d;d=f(f(a,b),f(a,c));printf("%d\n",d);}程序运行后的输出结果是A)10 B)9 C)8 D)723.有以下程序 B#include<stdio.h>int fun(int x,int y){if(x==y)return(x);else return((x+y)/2);}main(){int a=4,b=5,c=6;printf("%d\n",fun(2*a,fun(b,c)));}程序运行后的输出结果是A)3 B)6 C)8 D)1224.设函数中有整型变量n,为保证其在未赋初值的情况下初值为0,应该选择的存储类别是 CA)autoB)registerC)staticD)auto 或register25.有以下程序 C#include <stdio.h>void fun(int p){ int d=2;p=d++; printf(“%d”,p);}main(){ int a=1;fun(a); printf(“%d\n”,a);}程序运行后的输出结果是A)32 B)12 C)21 D)22 26.有以下程序 C#include <stdio.h>int f(int n);main(){ int a=3,s;s=f(a);s=s+f(a);printf(“%d\n”,s); }int f(int n){ static int a=1;n+=a++;return n;}程序运行以后的输出结果是A)7 B)8 C)9 D)10 27.有以下程序 A#include <stdio.h>#define f(x) x*x*xmain(){ int a=3,s,t;s=f(a+1);t=f((a+1));printf(“%d,%d\n’,s,t);}程序运行后的输出结果是A)10,64 B)10,10C)64,10 D)64,6428.有以下程序 D#include<stdio.h>#define PT 3.5;#define S(x)PT*x*x;main(){int a=1,b=2;printf("%4.1f\n",S(a+b));}程序运行后的输出结果是A)14.0B)31.5C)7.5D)程序有错无输出结果29.以下叙述正确的是 BA)C语言程序是由过程和函数组成的B)C语言函数可以嵌套调用,例如:fun(fun(x))C)C语言函数不可以单独编译D)C语言中除了main函数,其他函数不可作为单独文件形式存在若有定义语句:int m[]={5,4,3,2,1},i=4;, C则下面对m数组元素的引用错误的是A)m[--i]B)m[2*2]C)m[m[0]] D)m[m[i]]30.有以下程序 A#include<stdio.h>void fun(int a,int b){int t;t=a;a=b;b=t;}main(){int c[10]={1,2,3,4,5,6,7,8,9,0},i;for(i=0;i<10;i+=2)fun(c[i],c[i+1]);for(i=0;i<10;i++)printf("%d,",c[i]);printf("\n");}程序的运行结果是A)1,2,3,4,5,6,7,8,9,0,B)2,1,4,3,6,5,8,7,0,9, C)0,9,8,7,6,5,4,3,2,1,D)0,1,2,3,4,5,6,7,8,9, 31.有以下程序 Dvoid fun(int a[],int n){int i,t;for(i=0;i<n/2;i++){t=a[i];a[i]=a[n-1-i];a[n-1-i]=t;}}main(){int k[10]={1,2,3,4,5,6,7,8,9,10},i;fun(k,5);for(i=2;i<8;i++)printf("%d",k[i]);printf("\n");}程序的运行结果是A)345678B)876543C)1098765D)32167832.有以下程序 B#define N 4void fun(int a[][N],int b[]){int i;for(i=0;i<N;i++)b[i]=a[i][i];}main(){int x[][N]={{1,2,3},{4},{5,6,7,8},{9,10}},y[N],i;fun(x,y);for(i=0;i<N;i++)printf("%d,",y[i]);printf("\n");}程序的运行结果是A)1,2,3,4,B)1,0,7,0,C)1,4,5,9,D)3,4,8,10,33.以下函数findmax拟实现在数组中查找最大值并作为函数值返回,但程序中有错导致不能实现预定功能#define MIN -2147483647int findmax (int x[],int n){ int i,max;for(i=0;i<n;i++){ max=MIN;if(max<x[i]) max=x[i];}return max;}造成错误的原因是 DA)定义语句int i,max;中max未赋初值B)赋值语句max=MIN;中,不应给max赋MIN值C)语句if(max<x[i]) max=x[i];中判断条件设置错误D)赋值语句max=MIN;放错了位置34.有以下程序 B#include <stdio.h>main(){ char s[]={“012xy”};int i,n=0;for(i=0;s[i]!=0;i++)if(s[i]>=’a’&&s[i]<=’z’) n++;printf(“%d\n”,n);}程序运行后的输出结果是A)0 B)2 C)3 D)535.若有定义语句:char s[10]="1234567\0\0";,则strlen(s)的值是 A A)7B)8C)9D)10有以下程序#include<string.h>main(){ char a[10]=”abcd”;printf(“%d,%d\n”,strlen(a),sizeof(a));}程序运行后的输出结果是 BA)7,4 B)4,10C)8,8 D)10,1036.有以下程序 B#include <stdio.h>main(){ int m=1,n=2,*p=&m,*q=&n,*r;r=p;p=q;q=r;printf(“%d,%d,%d,%d\n”,m,n,*p,*q);}程序运行后的输出结果是A)1,2,1,2 B)1,2,2,1C)2,1,2,1 D)2,1,1,2若有定义语句:int a[4][10],*p,*q[4];且0≤i<4,则错误的赋值是 A A)p=a B)q[i]=a[i]C)p=a[i] D)p=&a[2][1]37.有以下程序#include <stdio.h>#include<string.h>main(){ char str[ ][20]={“One*World”, “One*Dream!”},*p=str[1];printf(“%d,”,strlen(p));printf(“%s\n”,p);}程序运行后的输出结果是 CA)9,One*World B)9,One*Dream!C)10,One*Dream! D)10,One*World38.下列函数的功能是 Afun(char * a,char * b){ while((*b=*a)!=’\0’) {a++,b++;} }A)将a所指字符串赋给b所指空间B)使指针b指向a所指字符串C)将a所指字符串和b所指字符串进行比较D)检查a和b所指字符串中是否有’\0’39.设有以下函数void fun(int n,char * s) {……}则下面对函数指针的定义和赋值均是正确的是 AA)void (*pf)(); pf=fun;B)void *pf(); pf=fun;C)void *pf(); *pf=fun;D)void (*pf)(int,char);pf=&fun;40设有定义:char *c;,以下选项中能够使字符型指针c正确指向一个字符串的是AA)char str[ ]=”string”;c=str;B)sca nf(“%s”,c);C)c=getchar();D)*c=”string”;41.以下关于C语言数据类型使用的叙述中错误的是 DA)若要准确无误差的表示自然数,应使用整数类型B)若要保存带有多位小数的数据,应使用双精度类型C)若要处理如“人员信息”等含有不同类型的相关数据,应自定义结构体类型D)若只处理“真”和“假”两种逻辑值,应使用逻辑类型42.下面结构体的定义语句中,错误的是 BA)struct ord {int x;int y;int z;}; struct ord a;B)struct ord {int x;int y;int z;} struct ord a;C)struct ord {int x;int y;int z;} a;D)struct {int x;int y;int z;} a;43.有以下程序#include <stdio.h>#include<string.h>struct A{ int a; char b[10]; double c;};struct A f(struct A t);main(){ struct A a={1001,”ZhangDa”,1098.0};a=f(a); printf(“%d,%s,%6.1f\n”,a.a,a.b,a.c);}struct A f(struct A t){t.a=1002;strcpy(t.b,”ChangRong”);t.c=1202.0;return t;}程序运行后的输出结果是 DA)1001,ZhangDa,1098.0 B)1002,ZhangDa,1202.0C)1001,ChangRong,1098.0 D)1002,ChangRong,1202.0 44.有以下程序 B#include<stdio.h>struct ord{int x,y;}dt[2]={1,2,3,4};main(){struct ord*p=dt;printf("%d,",++p->x);printf("%d\n",++p->y);}程序的运行结果是A)1,2B)2,3C)3,4D)4,145.设有语句struct st{int n; struct st *next;};static struct st a[3]={5,&a[1],7,&a[2],9,’\0’},*p;p=&a[0];则表达式 B 的值是6。
C语言中文件定位函数总结
C语⾔中⽂件定位函数总结C语⾔中⽂件定位函数主要是:fseek, ftell, fsetpos, fgetpos。
先来讲前两个函数,这是最基本的定位函数: fseek函数:能把⽂件指针移动到⽂件任何位置,其原型是:int fseek(FILE *fp, long offset, int fromwhere); 参数解释:第⼀个参数为要进⾏定位的⽂件的指针;第⼆个参数为定位的偏移量,⼀个有符号的long类型值,正数表⽰⽂件指针向后偏移,负数表⽰⽂件指针向前偏移,0 表⽰不进⾏偏移;第三个参数表⽰⽂件指针从哪个位置开始偏移,有三个值可选,SEEK_SET & SEEK_CUR & SEEK_END,分别表⽰⽂件第⼀个字节(即第零个位置),⽂件指针当前所指字节(即当前位置)和⽂件EOF位置。
返回值:返回 0 表⽰操作成功,返回⾮ 0 表⽰操作失败。
其他注意:该函数不能定位到第⼀个字节之前的位置,如果尝试这样操作会导致fseek返回 -1,即操作失败,⽐如这样的代码“j = fseek(fp, -4L, SEEK_SET );”,其中 j 值就是 -1;但是,该函数能定位到EOF位置之后的位置,并且不报错,即使这样是没有意义的,⽐如这样的代码“j = fseek(fp, 4L, SEEK_END)”,返回值 j 是 0,并且此时 ftell(fp) 返回值是SEEK_END + 4。
ftell函数:能返回当前⽂件指针所在的位置(⽂件的第⼀个字节所在位置是零),其原型是:long ftell(FILE *fp); 参数解释:有且仅有⼀个参数,为⼀个⽂件的指针。
返回值:有符号long类型的正向值,即0~2147483647。
其他注意:暂⽆。
实际上,前两个函数对⽂件指针的定位虽然都很⽅便,但是它们都有⼀个局限性,那就是它们能定位的最⼤字节是依据 long 类型的取值范围决定。
⽐如 fseek(fp, max_pos, SEEK_SET);,它能移动的最⼤偏移量是 max_pos = 2147483647字节,即1GB,对于⼤于1GB的⽂件来说就⼒不从⼼了。