关于C程序模块化基础的问题,显示javascript void 0非法

C语言入门文档-真格学网-IT技术综合网站
C语言入门文档
来源: &责任编辑:小易 &时间: 10:24:02
我想学C语言,需要什么基础吗问:我现在上初一,英语不是很好,数学比较好学校C语言需要什么基础?(自...答:楼上几乎都是扯淡,什么C语言是入门,有几个人敢说把C玩溜了?去看看现在世界上各语言使用率的排名,C语言一直前三甲,C语言因为其古怪的语法吓跑了多少人了--初中数学好不好都没关系,因为用到的数学知识都是高等数学,不过前期学基本不太用什么数...c语言编程怎样入门问:介绍学习方法再给点资源答:一、工欲善其事,必先利其器这里介绍几个学习C语言必备的装置和书籍:A)开发环境例如turboC2.0,这个曾经占据了DOS时代开发程序的大半个江山。但是现在windows时代,用turboC有感觉不方面,编辑程序起来很吃力,并且拖放,更没有函数变量...C语言入门文档(图1)C语言入门文档(图2)C语言入门文档(图3)C语言入门文档(图4)C语言入门文档(图5)C语言入门文档(图6)c语言入门级问题helloworld问:以前在高中学pascal现在要进大学了,所以准备先熟悉一下C.我看的书是《C...答:如果是.c文件可以通过,.cpp文件就不行了现在标准的写法应是这样:#includeintmain(void){printf("helloworld\n");return0;}.c是C语言源代码文件,.cpp是C++源代码文件。防恶意抓取,请查看原文,,真格学网提供内容。==========以下对应文字版==========初学C语言,没有计算机基础,应该先从什么开始学起答:1,任何语言都是为应用服务的。这里的应用主要在测试方面。首先应该明确这一点。2,C语言能不能速成因人而异,大学里一般C语言一般60课时左右(40*6。防恶意抓取,请查看原文,,真格学网提供内容。04Function (函数) Structure: lanaguageteach group Wen He NEUSOFT Knowledgepoint FunctionDefinition 函数定义 ReturnStatement 返回语句 FunctionCall 函数调用 Variablestorage types 变量存储类型 Recursivefunction calls 函数递归调用 NEUSOFT modularprogramming language (C是模块化程序设计语言) programstructure (C程序结构) C是函数式语言 必须有且只能有一个名为main的主函数 C程序的执行总是从main函数开始,在main中结束 函数不能嵌套定义,可以嵌套调用 NEUSOFT function#include
integersinput:integer output/returnvalue: sum intAdd (int /*mainfunction*/ printf("Inputtwo integers:"); scanf("%d%d", sum); 标准函数(库函数):libraryfunctions 用户自定义函数user functions 无参函数non-argument argumentsNEUSOFT FunctionDefinition Format: type name(argument statement)
FunctionDefinition NEUSOFT 合法标识符函数返回值类型 缺省int型 无返回值void 函数体 函数类型 函数名(形参类型说明表) 说明部分语句部分 格式:Eg: 有参函数(with arguments) int max(int x,int Eg:有参函数 int max(int 空函数dummy( 函数体为空Eg: 无参函数(non-argument) printstar( FunctionDefinition void sum() intsum() floatsum() doublesum(int a,int 有类型标志符的函数,其函数体内一定有 return语句 void sum(int NEUSOFT10 Format: return (expression); Annotation: programreturns callingfunction,the value expressionreturns itscaller. 返回调用函数 morethan one return statements,but onlyone return value function.可能不止一个return语句,但一次只能带回一个 返回值。编程入门是学C语言好,还是C++?答:C语言:是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的...。防恶意抓取,请查看原文,,真格学网提供内容。Return statement NEUSOFT 11 Return statement float max(float intmain() scanf("%f,%f",&a,&b);c=max(a,b); printf("Max NEUSOFT12 Prototyping Function(函数的声明)We used ANSIprototype functionbefore used(函数使用之前需要ANSI 原型声明) format: type name(argument statement); example: float max(float floatmax(float, float); NEUSOFT 13 Example: float add(float,float); /*function declaration*/ main() scanf("%f,%f",&a,&b);c=add(a,b); printf("sum floatadd(float Function(函数的声明)NEUSOFT 14 main() scanf("%f,%f",&a,&b);c=max(a,b); printf("Max int型函数可不作函数说明/*Example*/ float add(float scanf("%f,%f",&a,&b);c=add(a,b); printf("sum 被调函数出现在主调函数之前,不必函数说明 Prototyping Function(函数的声明)NEUSOFT Calling Function(函数调用)Calling Functionwithout Argument: function name Argument:function name( Actual Arguments ActualArguments Formalparameter 按顺序一一对应NEUSOFT Calling Function(函数调用)无参函数的调用形式: 函数名(); 有参函数的调用形式: 函数名(实参); 实参与形参: 按顺序一一对应NEUSOFT 17 Calling Function(函数调用)NEUSOFT 18 Calling main() scanf("%f,%f",&a,&b);c=max(a,b); printf("Max intmax(float NEUSOFT19 Functionparameters transfermode Formalparameter &Actual Arguments 实际参数:调用函数时函数名后面括号中的表达式c=max(a,b); (main 函数) (max 函数) int max(int 比较两个数并输出大者main() scanf("%d,%d",&a,&b);c=max(a,b); printf("Max intmax(int 实参NEUSOFT 20 若形参与实参类型不一致,自动按形参类型转换―――函数调用转换 形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放 Functionparameters transfermode Formalparameter &Actual Arguments 实际参数:调用函数时函数名后面括号中的表达式NEUSOFT 21 计算x的立方#include
float cube(printf("Please input value scanf("%f",&a);product=cube(a); printf(”Cube 1.21.2 1.728 NEUSOFT 22 Parameterpassing functioncall Allocationunit argEnd call,parameter unit released,Arguments originalvalue. argumentstake different memoryunit One-waytransfer NEUSOFT 23 参数传递方式值传递方式 方式:函数调用时,为 形参分配单元,并将实参的值复制到 形参中;调用结束,形参单元被释 放,实参单元仍保留并维持原值 单向传递NEUSOFT 24 调用前:调用结束: 例4.5交换两个数 /*ch4_5.c*/ #include
main() intx=7,y=11; printf("x=%d,\ty=%d\n",x,y); printf("swapped:\n"); swap(x,y); printf("x=%d,\ty=%d\n",x,y); swap(inta, temp=a; tempNEUSOFT 25 Functioncall, datastorage address passed argumentstake samestorage unit "Two-way"transfer formalparameters must variableaddress NEUSOFT 26 方式:函数调用时,将数据的存储地址作为参数传递给形参 实参和形参必须是地址常量或变量NEUSOFT 27 /*ch9_3.c*/ swap(p1,p2) int *p1,*p2; p=*p1;*p1=*p2; *p2=p; printf(“swapped:\n”);swap(&a,&b); Exanple:交换两个数 调swap:p1 交换:p1 返回:NEUSOFT 28 Nested function calls (函数嵌套调用) NEUSOFT 29 Nested function calls f1(){ NEUSOFT30 #include
long sum(int longfactorial(int intn1,n2; long scanf("%d,%d",&n1,&n2);a=sum(n1,n2); printf("a=%1d",a); longsum(int a,int longc1,c2; c1=factorial(a); c2=factorial(b); return(c1+c2); longfactorial(int longrtn=1; int rtn*=i;return(rtn); longsum(int 文件包含编译预处理命令函数类型说明 函数定义 函数调用 函数调用 函数返回值 实参NEUSOFT 31 求三个数中最大数和最小数的差值#include
int dif(int x,int y,int intmax(int x,int y,int intmin(int x,int y,int voidmain() d=dif(a,b,c);printf("Max-Min=%d\n",d); Ch7_202.cint dif(int x,int y,int returnmax(x,y,z)-min(x,y,z); intmax(int x,int y,int intmin(int x,int y,int 调用函数dif输出 结束 dif函数 max函数 调用函数max 调用函数min min函数 NEUSOFT 32 Practice 1、计算s=1 函数首部为:long f1(int n,int /*计算n的k次方*/long f2(int n,int /*计算1到n的k次方之累加和*/ NEUSOFT 33 Answer #define longf1(int n,int longpower=n; longf2(int n,int longsum=0; integersfrom NEUSOFT34 Recursion (递归) NEUSOFT 35 Recursion C语言的函数调用允许直接或间接地调用该函数本身,称为函 数的递归调用。学习C语言要些什么基础!问:我毕业好多年了,中专毕业,现在在做零售行业,想用业作时间去学习C语言,想...答:C语言属于易学难精的一门计算机语言。如果只是简单学习C语言,那么符合以下条件即可开始学习:1、识字,可以阅读C语言教材;2、认识英文字母,标点符合,阿拉伯数字,并可以在电脑上打出来。如果要想把C语言学的精通,那么如果有如下基础,...。防恶意抓取,请查看原文,,真格学网提供内容。含有直接或间接调用自己的函数称为递归函数。c语言入门买什么书好答:如果想以后深入的话不推荐国内的书(谭浩强的过分注重语法细节,而且讲得不深入,代码风格也不好)如果只是学一下,以后没想过要深入编程的话可以看谭的书(大学都用这书)国外的经典我推荐。防恶意抓取,请查看原文,,真格学网提供内容。函数f 调用函数f 函数f1 调用函数f2 调用函数f1 函数f2 直接调用本身 直接调用本身 间接调用本身 间接调用本身 NEUSOFT 36 Example1 #include void up_and_down(int); int main(void) up_and_down(1);return voidup_and_down(int up_and_down(n+1);printf("LEVEL NEUSOFT37 Example1 NEUSOFT 38 用递归函数求4! Example2NEUSOFT 39 (n-1)!int myFac( int //递归的结束条件return n*myFac(n-1); myFac(n)就是求n! myFac(n-1) 就是求(n-1)! Example2 NEUSOFT 40 #include
int myFac(int myFac(n);printf("%d!=%d\n", Example2int myFac( int n*myFac(n-1);return 41Computing Factorial factorial(4) 24factorial(0) n*factorial(n-1);42 Trace Recursive factorial Executesfactorial(4) Main method SpaceRequired factorial(3)Space Required factorial(2)Space Required SpaceRequired factorial(3)Space Required factorial(2)Space Required factorial(1)Space Required SpaceRequired factorial(3)Space Required factorial(2)Space Required factorial(1)Space Required factorial(0)Stack 43 Trace Recursive factorial Executesfactorial(3) Main method SpaceRequired factorial(3)Space Required factorial(2)Space Required SpaceRequired factorial(3)Space Required factorial(2)Space Required factorial(1)Space Required Stack44 Trace Recursive factorial Executesfactorial(2) 45Trace Recursive factorial Executesfactorial(1) 46Trace Recursive factorial Executesfactorial(0)学完C语言入门后学什么答:本文标签:C入门后学习方向很多同学学完C语言,就急着学习别的语言,但你真的掌握了这门语言了吗?可以说,你只是按照书上的例题打了一遍,连入门都不算,如果放下书,给你个书上的例题,你能直接把代码写出来吗?不要急着学这个语言,那个语言...。防恶意抓取,请查看原文,,真格学网提供内容。求c语言入门基础教程视频哪有人学不会的?哪个人不是从零基础开始学的,你又不是第一个?对,你要先学C语言,是编程入门的,自己学的话看视频不如看书,看相应语言的帮助文档。再自己动手多练多写。...。防恶意抓取,请查看原文,,真格学网提供内容。C语言程序设计该如何入门?问:没一点英语和计算机基础能学好么答:1多看书。这个是基矗没人能够凭空就会,只能多看书。2多上机。C语言是一门编程语言,最终的目的是为了编程。所以也只有在实战中才能够更快的理解知识点,达到快速上手的目的。3多想。不要死读书,多想想为什么。理解了才能掌握的更扎实。4...学c语言该怎么入门答:您好,入门的捷径只有一条:阅读一本经典教材。在这方面,我推荐两本书:《C语言程序设计-现代方法》和《Cprimerplus》。经典入门教材足够友好,足够详细,绝对让你事半功倍。反之如果看一本垃圾书,那才是一看一个坑,最后你还得回头不停地...c语言入门级问题helloworld问:以前在高中学pascal现在要进大学了,所以准备先熟悉一下C.我看的书是《C...答:如果是.c文件可以通过,.cpp文件就不行了现在标准的写法应是这样:#includeintmain(void){printf("helloworld\n");return0;}.c是C语言源代码文件,.cpp是C++源代码文件
本文相关:安全检查中...
请打开浏览器的javascript,然后刷新浏览器
< 浏览器安全检查中...
还剩 5 秒&《C语言程序设计》教案
《(C)》教案
山东财经大学
计算机信息工程学院
第一章& C语言概述
§1.1&& C语言的历史和特点
一、C语言的历史
Algol 60 → BCPL → B → C → 旧标准C →& ANSI& C&& → C++ →Visual C++
&& ┆& &&&&┆&&&&&
┆&&&& ┆&& ┆&&&&&
┆&&& (新标准C)
&&&& && &&&&&
&&&&&&& &&&&&&&&&&&&&&&&&
& 1960&&& 1963&&& 1967&& 1970& 1972&& 1978&&&&& 1983
C语言的诞生与发展:在C语言诞生以前,系统软件主要是用汇编语言编写的。由于汇编语言程序依赖于计算机硬件,其可读性和可移植性都很差;但一般的高级语言又难以实现对计算机硬件的直接操作(这正是汇编语言的优势),于是人们盼望有一种兼有汇编语言和高级语言特性的新语言。C语言是贝尔实验室于70年代初研制出来的,后来又被多次改进,并出现了多种版本。80年代初,美国国家标准化协会(ANSI),根据C语言问世以来各种版本对C语言的发展和扩充,制定了ANSI C标准(1989年再次做了修订)。
&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&
& &&&&&&&&&&&&&&&&&&&&&&&&&&&
&p=1, i=2&&&&&&&&&&&&&&&&&
& i&=5&&&&&&&&&&&&&&
p=pi, i=i+1
p=pi, i=i+1&&&&&&&&&&&&&&
&& &&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&
. &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
第三章& 数据类型、运算符与表达式
§3.1& 数据类型
C的数据类型有:
1、基本类型:整型、字符型、实型(浮点型)、枚举型
2、构造类型:数组类型、结构体类型、共用体类型
3、指针类型
~&&&&&& ( 按位 ) 取反 → 单目运算符
&&&&&&&&&&
&& 、&&&&&& 左移 、右移
&&&&&&&&&&&&&
&&&&& &&&按位与&&&&&&&&&&&
&&&&&&&&&&&&
∧&&&&&&& 按位异或&&&&&&&&
双目运算符
&&& 低&&&&&&
与其它运算符的优先级别:P375~376
单目 算术 && && 关系& & ∧ | 逻辑 三目 赋值 逗号
&#8226;位运算的运算量(即操作数)为整型或字符型数据
1.按位与──&
&& (1)格式:x&y
&& (2)规则:对应位均为1时才为1,否则为0:3&9=1。
例如,3&9=1:&&&&&
&&&&&&&&&&&&&
&&&&&& 1001&&&
&&&&& &&&&&&&&&&&&
───&&&&
&&&&&&&&&&&&&&&&&&&&
(3)主要用途:取(或保留)1个数的某(些)位,其余各位置0。
2.按位或──|
&& (1)格式:x|y
&& (2)规则:对应位均为0时才为0,否则为1:3|9=11。
例如,3|9=11:&&&& 0011&
&&&&&&&&&&&&&&&&
|&& 1001&&&&
&&&&&&&&&&&&&&&&&
────&&&&&&& &&&
&&&&&&&&&&&
&&&&&&&&&1011& =11&
&& (3)主要用途:将1个数的某(些)位置1,其余各位不变。
3.按位异或──∧
(1)格式:x∧y
(2)规则:对应位相同时为0,不同时为1:3∧9=10。
(3)主要用途:使1个数的某(些)位翻转(即原来为1的位变为0,为0的变为1),其余各位不变。
4.按位取反── ~
(1)格式:~x
(2)规则:各位翻转,即原来为1的位变成0,原来为0的位变成1:
在IBM-PC机中,~0=0xffff,~9=0xfff6。
(3)主要用途:间接地构造一个数,以增强程序的可移植性。
5.按位左移──
(1)格式:x&&
(2)规则:使操作数的各位左移,低位补0,高位溢出:5&&2=20。
6.按位右移──&&
(1)格式:x&&位数
(2)规则:使操作数的各位右移,移出的低位舍弃;高位:
①对无符号数和有符号中的正数,补0;
②有符号数中的负数,取决于所使用的系统:补0的称为“逻辑右移”,补1的称为“算术右移”。例如,20 && 2=5。
(1)x、y和“位数”等操作数,都只能是整型或字符型数据。除按位取反为单目运算符外,其余均为双目运算符。
(2)参与运算时,操作数x和y,都必须首先转换成二进制形式,然后再执行相应的按位运算。
例如,5&&2=20:0101 → 10100,20
&& 2=5:10100 → 00101。
(3)实现&、|、∧运算主要用途的方法
&&& ①构造1个整数:该数在要取(或保留)的位、或要置1的位、或要翻转的位上为1,其余均为0。
&&& ②进行按位与、或按位或、或按位异或操作。
(4)实现按位取反主要用途的方法
①求~0,间接地构造一个全1的数;
&& ②按需要进行左移或右移操作,构造出所需要的数。
例如,直接构造一个全1的数,在IBM-PC机中为0xffff(2字节),而在VAX-11/780上,却是0xffffffff(4字节)。如果用~0来构造,系统可以自动适应。
(5).复合赋值运算符
除按位取反运算外,其余5个位运算符均可与赋值运算符一起,构成复合赋值运算符: &=、|+、^=、&&=、&&=
(6)不同长度数据间的位运算──低字节对齐,短数的高字节按最高位补位:
①对无符号数和有符号中的正数,补0;
②有符号数中的负数,补1。
二、应用举例
例、从键盘上输入1个正整数给int变量num,输出由8~11位构成的数(从低位、0号开始编号)。
基本思路:(1)使变量num右移8位,将8~11位移到低4位上。
(2)构造1个低4位为1、其余各位为0的整数。
(3)与num进行按位与运算。
{ int num,
printf(&Input a integer number: &);
scanf(&%d&,&num);
&&&&&& num
&&= 8; /*右移8位,将8~11位移到低4位上*/
&&&&&& mask = ~(~0 && 4);
& & /*间接构造1个低4位为1、其余各位为0的整数*/
printf(&result=0x%x\n&, num & mask);
程序运行情况:
Input a integer number:1000 ←┘
result=0x3
程序说明:~(~0 && 4)
按位取0的反,为全1;左移4位后,其低4位为0,其余各位为1;再按位取反,则其低4位为1,其余各位为0。这个整数正是我们所需要的。
三、位段简介
有时,存储1个信息不必占用1个字节,只需二进制的1个(或多个)位就够用。如果仍然使用结构类型,则造成内存空间的浪费。为此,C语言引入了位段类型。
&1. 位段的概念与定义
&&& 所谓位段类型,是一种特殊的结构类型,其所有成员均以二进制位为单位定义长度,并称成员为位段。
例如,CPU的状态寄存器,按位段类型定义如下:
struct status
{ unsigned sign: 1;& & /*符号标志*/
&&&&&& unsigned
/*零标志*/
&&&&&& unsigned
carry: 1;& &&& /*进位标志*/
&&&&&& unsigned
parity: 1;& && /*奇偶/溢出标志*/
&&&&&& unsigned
half_carry: 1; /*半进位标志*/
&&&&&& unsigned
negative: 1;&
/*减标志*/
显然,对CPU的状态寄存器而言,使用位段类型(仅需1个字节),比使用结构类型(需要6个字节)节省了5个字节。
(1)因为位段类型是一种结构类型,所以位段类型和位段变量的定义,以及对位段(即位段类型中的成员)的引用,均与结构类型和结构变量一样。
(2)对位段赋值时,要注意取置范围。一般地说,长度为n的位段,其取值范围是:0~(2n-1)。
(3)使用长度为0的无名位段,可使其后续位段从下1个字节开始存储。
struct status
{& unsigned sign: 1;&
/*符号标志*/
unsigned zero: 1;& &&& /*零标志*/
unsigned carry: 1;& && /*进位标志*/
unsigned : 0;&
/*长度为0的无名位段*/
&&&&&&& unsigned
parity: 1; /*奇偶/溢出标志*/
unsigned half_carry: 1;/*半进位标志*/
&& unsigned
negative: 1;& & /*减标志*/
原本6个标志位是连续存储在1个字节中的。由于加入了1个长度为0的无名位段,所以其后的3个位段,从下1个字节开始存储,一共占用2个字节。
(4)1个位段必须存储在1个存储单元(通常为1字节)中,不能跨2个。如果本单元不够容纳某位段,则从下1个单元开始存储该位段。
(5)可以用%d、%x、%u和%o等格式字符,以整数形式输出位段。
(6)在数值表达式中引用位段时,系统自动将位段转换为整型数。
第十三章& 文件
在程序运行时,程序本身和数据一般都存放在内存中。当程序运行结束后,存放在内存中的数据被释放。如果需要长期保存程序运行所需的原始数据,或程序运行产生的结果,就必须以文件形式存储到外部存储介质上。
&#8226;OS以文件为单位对数据进行存储管理。
&#8226;流与文件
&流:C提供的一个 I/O统一接口, 与具体的被访问设备无关。把 I/O工作抽象成从源到目地的流, 所有的 I/O 通过流来进行, 所有流都具有相同的行为。
&文件: 指具体的实际设备(一切具有 I/O能力的外部设备)。
∵各设备有不同的功能, ∴文件并不都一样,
&&&& ∵C的 I/O系统把来自设备的信息转换到流,再流到对应设备,
∴编程者不必考虑具体的物理设备。
&#8226;C把文件看作一个字符(字节)序列, 即由一个个字符数据顺序组成的数据流(无任何定界符, 对文件的存取以字节位单位)。这种文件也称为流式文件。
&#8226;流式文件根据数据组织形式分为,
&&&& ①ASCII文件(即文本文件)&&& &&&&&&文字流
&&&& ②二进制文件&&&&&&&&&&&&&&&&&&&
&#8226;Turbo C所遵循的ANSI(美国国家标准学会)标准定义了一组完整的 I/O操作函数, 叫“缓冲文件系统”;
但旧的UNIX系统下使用的C还定义了另一组, 叫“非缓冲文件系统”。
&缓冲文件系统:系统自动地在内存为每一个打开的文件分配一个缓冲区。
&非缓冲文件系统:由编程者自己在程序中为每个打开的文件设定缓冲区。
如何获得对文件的使用&&&&&&&&&&
打开 / 关闭文件
↓ &&&&&&&&&&&&&&&&
如何了解“被使用文件”的信息&&&&& 通过文件指针
&&&&& ↓&&&&&&&&&
如何操作文件&&&&&&&&&&
文件读 / 写、文件定位、文件状态
二、文件的打开与关闭
1.文件类型FILE
系统给每个打开的文件都在内存中开辟一个区域,用于存放文件的有关信息(如文件名、文件位置等)。这些信息保存在一个结构类型变量中,该结构类型由系统定义、取名为FILE。
注意:结构类型名“FILE”必须大写。
2. 打开文件──fopen( )函数
对文件进行操作之前,必须先打开该文件;使用结束后,应立即关闭,以免数据丢失。
C语言规定了标准输入输出函数库,用fopen()函数打开一个文件,用fclose()函数关闭一个文件。
用法: FILE& *fopen(&文件名&,&操作方式&);
功能:返回一个指向指定文件的指针。
函数原型:stdio.h 。
注:对文件操作的库函数,函数原型均在头文件stdio.h中。后续函数不再赘述。
(1)“文件名”是指要打开(或创建)的文件名。如果使用字符数组(或字符指针),则不使用双引号。
(2)“操作方式”如P312 表13.1 所示。
“w”、“wb”、“w+”、“wb+” : 该文件已存在,原有内容全部清除,准备接收新内容 (对“w+”、“wb+”若不写先读 → 读出内容为空内容);该文件不存在,建立该文件,准备接收新内容。
“a”、“ab”、“a+”、“ab+” :该文件已存在,末尾追加数据;不存在,建立该文件, 准备接收新内容。
“r”、“rb” : 该文件必须已经存在, 且只能读文件
“r+”、“rb+”:该文件必须已经存在,不写先读→读出原内容;先写后读→覆盖原内容。 例、原内容为aaaaaa,写入内容为cccc,则文件内容为ccccaa。
例如,FILE&
*& fp=fopen(&data.99&,&r&);
(3)如果不能实现打开指定文件的操作,则fopen(
)函数返回一个空指针NULL (其值在头文件stdio.h中被定义为0)。
为增强程序的可靠性,常用下面的方法打开一个文件:
&&&& if((fp=fopen(&文件名&,&操作方式&))==NULL)
&&&& { printf(&can not
open this file\n&);
(4)使用文本文件向计算机系统输入数据时,系统自动将回车换行符转换成一个换行符;在输出时,将换行符转换成回车和换行两个字符。
使用二进制文件时,内存中的数据形式与数据文件中的形式完全一样,就不再进行转换。
(5)有些C编译系统,可能并不完全提供上述对文件的操作方式,或采用的表示符号不同,请注意所使用系统的规定。
(6)在程序开始运行时,系统自动打开三个标准文件,并分别定义了文件指针:
①标准输入文件——stdin:指向终端输入(一般为键盘)。如果程序中指定要从stdin所指的文件输入数据,就是从终端键盘上输入数据。
②标准输出文件——stdout:指向终端输出(一般为显示器)。
③标准错误文件——stderr:指向终端标准错误输出(一般为显示器)。
3.文件的关闭──fcolse( )函数
(1)用法: int& fclose(FILE& *文件指针);
(2)功能:关闭“文件指针”所指向的文件。如果正常关闭了文件,则函数返回值为0;否则,返回值为非0。
例如,fclose(fp);/*关闭fp所指向的文件*/
三、文件的读写
1& 读/写一个字符
⑴ 写一个字符fputc( ):
fputc(字符数据,文件指针);
其中“字符数据”,既可以是字符常量,也可以是字符变量。
功能:将字符数据输出到“文件指针”所指向的文件中去,同时将读写位置指针向前移动1个字节(即指向下一个写入位置)。
如果输出成功,则函数返回值就是输出的字符数据;否则,返回一个符号常量EOF(其值在头文件stdio.h中,被定义为-1)。
①关于符号常量EOF
&在对ASCII码文件执行读入操作时,如果遇到文件尾,则读操作函数返回一个文件结束标志EOF(其值在头文件stdio.h中被定义为-1)。
在对二进制文件执行读入操作时,必须使用库函数feof()来判断是否遇到文件尾。
②库函数feof( ):
&&&&&&&&&&&&&
int& feof(文件指针);
&&& 功能:在执行读文件操作时,如果遇到文件尾,则函数返回逻辑真(1);否则,则返回逻辑假(0)。feof()函数同时适用于ASCII码文件和二进制文件。
例如,!feof(input))表示源文件(用于输入)未结束,循环继续。
⑵ 读一个字符fgetc( )
&&&&&&&&&&&&&
int& fgetc(文件指针);
功能:从“文件指针”所指向的文件中,读入一个字符,同时将读写位置指针向前移动1个字节(即指向下一个字符)。该函数无出错返回值。
例如,fgetc(fp)表达式,从文件fp中读一个字符,同时将fp的读写位置指针向前移动到下一个字符。
例、从键盘输入字符(‘#’符号结束)写到磁盘文件并输出。
main( int& argc, char& *argv[ ] )
{ FILE& *&& char&
&& if (argc!=2) /*文件名aa.c→aa.exe, 则执行D&aa& x.txt*/
printf(&You forgot& to enter
the filename.\n&);
& && &&exit(0);& }
&& if ((fp=fopen(argv[1],
&w&))==NULL )
&&&&&&&&&&
/* 文件使用方式也可为wb、w+、wb+& */
printf(&Cannot open file.\n&); exit(0); }
&& do& { ch=getchar( ); & &fputc(ch,
&& while (ch!=‘#’);
&& fclose(fp);
if ((fp=fopen(argv[1], “r”))==NULL
{ printf(“Cannot open file.\n”);
exit(0); }
ch=fgetc(fp);
while(ch!=EOF)& putchar(ch),
ch=fgetc(fp);
printf(“\n”);&&
fclose(fp);
2、读/写一个字符串
⑴向指定文件输出一个字符串fputs( )
fputs(字符串,文件指针);
其中“字符串”可以是一个字符串常量,或字符数组名,或字符指针变量名。
功能:向指定文件输出一个字符串,同时将读写位置指针向前移动strlength(字符串长度)个字节。如果输出成功,则函数返回值为0;否则,为非0值。
⑵从文件中读一个字符串fgets( )
*fgets(指针,串长度+1,文件指针);
功能:从指定文件中读入一个字符串,存入“字符数组/指针”中,并在尾端自动加一个结束标志'\0';同时,将读写位置指针向前移动strlength(字符串长度)个字节。
如果在读入规定长度之前遇到文件尾EOF或换行符,读入即结束。
例、将键盘上输入的一个长度不超过80的字符串,以ASCII码形式存储到一个磁盘文件中;然后再输出到屏幕上。
#include &stdio.h&
main(int argc, char *argv[])/*参数:可执行文件名& 要创建的磁盘文件名*/
&&&&&& char
string[81]; /*字符数组用于暂存输入输出的字符串*/
if(argc&2)&&&&&&&&&&&
/*参数太多,提示
{& printf(&Too many
parameters…\n\n&);
&& &&&&&&&&&&
printf(&Usage: 可执行文件名&
filename\n&);
&&&&&&&&&&&&
if(argc==1)&&&&&& && /*缺磁盘文件名,提示输入*/
printf(&Input the filename: &);
gets(string);&&&&& /*借用string暂存输入的文件名*/
argv[1]=(char *)malloc(strlen(string)+1);/*给文件名参数申请内存空间*/
strcpy(argv[1],string);/*复制文件名到形参中*/
((fp=fopen(argv[1],&w&))==NULL)&& & /*打开文件失败*/
&&&&& {& printf(&can not open this
&& &&&&& exit(0);
&&&&& /*从键盘上输入字符串,并存储到指定文件中*/
printf(&Input a string: &); gets(string); /*从键盘上输入字符串*/
fputs(string, fp);&& /*存储到指定文件*/
fclose(fp);
/*重新打开文件,读出其中的字符串,并输出到屏幕上*/
((fp=fopen(argv[1],&r&))==NULL)&& & /*打开文件失败*/
&&&&& {& printf(&can not open this
&&&&& fgets(string,
strlen(string)+1, fp);&& /*从文件中读一个字符串*/
printf(&Output the string: &); puts(string);& /*将字符串输出到屏幕上*/
&&&&& fclose(fp);
为增强程序的可靠性,程序中对参数过多的情况,提示出错、并终止程序运行;而遗漏文件名时,提示用户输入。
同时,为增强程序的人机交互性,凡是需要用户输入数据的地方,都设置提示输入的信息;凡是输出数据的地方,都设置输出说明信息。
3& 读/写一个数据块
实际应用中,常常要求1次读/写1个数据块。为此,ANSI& C 标准设置了 fread( ) 和fwrite( )函数。
fread(void *buffer,int size,int
count,FILE *fp);
fwrite(void *buffer,int size,int
count,FILE *fp);
fread( )──从fp所指向文件的当前位置开始,一次读入size个字节,重复count次,并将读入的数据存放到从buffer开始的内存中;同时,将读写位置指针向前移动size* count个字节。其中,buffer是存放读入数据的起始地址(即存放何处)。
fwrite( )──从buffer开始,一次输出size个字节,重复count次, 并将输出的数据存放到fp所指向的文件中;同时,将读写位置指针向前移动size* count个字节。其中,buffer是要输出数据在内存中的起始地址(即从何处开始输出)。
如果调用fread( )或fwrite( )成功,则函数返回值等于count。fread( )和fwrite(
)函数,一般用于二进制文件的处理。
例、对文件输入输出实型数组。
#include&&
{ FILE& *&& float& a[10], b[10];&& int& i;
((fp=fopen(&test.txt&,&w+&))==NULL)
{& printf(&Cannot open
file.\n&);
&& printf(&请输入十个实型数:\n&);
&& for(i=0; i&10; i++)&& scanf(&%f&, &a[i]);
&& fwrite( a, sizeof(a), 1, fp
&& rewind(fp);/* rewind( ) P324 */
&& fread( b, sizeof(b), 1, fp);
&& for(i=0; i&10; i++)&& printf(&%8g&, b[i]);
&& printf(&\n&);
&& fclose(fp);
&}&&&&&&&&&&&&&&&&&&&&
4& 对文件进行格式化读/写
与scanf()和printf()函数的功能相似,区别在于:fscanf()和fprintf()函数的操作对象是指定文件,而scanf()和printf()函数的操作对象是标准输入(stdin)输出(stdout)文件。
int& fscanf(文件指针,&格式符&,输入变量首地址表);
int& fprintf(文件指针,&格式符&,输出参量表);
例如, int i=3; float f=9.80;
fprintf(fp,&%2d,%6.2f&,
fprintf( )函数的作用是,将变量i按%2d格式、变量f按%6.2f格式,以逗号作分隔符,输出到fp所指向的文件中:□3,□□9.80(□表示1个空格)。
例、 #include& &stdio.h&
{ long& a;&& short& b;
&&&&&&&&&&
fscanf(stdin, “%ld,%*5d,%2hd”, &a, &b);
&&&&&&&&&&
fprintf(stdout, “%ld, %hd\n”, a, b);
}&& &&&&&&&&&&&&&&&&
或& #include
& { FILE& *&& long& a,&& short& b,
&&&& if ((fp=fopen(“aw.txt”,“wb+”))==NULL)
{ printf(“文件打开出错.”);&
&&&& scanf
(&%ld,%*5d,%2hd&, &a, &b);
&&&& fprintf
(fp,&%ld,%ld,%hd&, a, 99L,
&&&& rewind(fp);
fscanf(fp,&%ld,%*ld,%2hd&, &c, &d);
printf(&%ld, %hd\n&, c, d);
&&&& sleep(2);
& }& &&&&&&&&&&&&&&&&&
四、文件的定位
文件中有一个读写位置指针,指向当前的读写位置。每次读写1个(或1组)数据后,系统自动将位置指针移动到下一个读写位置上。
&&&&&& 如果想改变系统这种读写规律,可使用有关文件定位的函数。
1、位置指针复位函数rewind()
rewind(文件指针);
功能:使文件的位置指针返回到文件头。
2、随机读写与fseek()函数
对于流式文件,既可以顺序读写,也可随机读写,关键在于控制文件的位置指针。所谓顺序读写是指读写完当前数据后,系统自动将文件的位置指针移动到下一个读写位置上。所谓随机读写是指读写完当前数据后,可通过调用fseek()函数,将位置指针移动到文件中任何一个地方。
int& fseek(文件指针,位移量,参照点);
功能:将指定文件的位置指针,从参照点开始,移动指定的字节数。
(1)参照点:用0(文件头)、1(当前位置)和2(文件尾)表示。
在ANSI C标准中,还规定了下面的名字:
SEEK_SET──文件头,
SEEK_CUR──当前位置,
SEEK_END──文件尾
(2)位移量:以参照点为起点,向前(当位移量&0时)或后(当位移量&0时)移动的字节数。在ANSI C标准中,要求位移量为long int型数据。
fseek()函数一般用于二进制文件。
五、返回文件当前位置的函数ftell( )
由于文件的位置指针可以任意移动,也经常移动,往往容易迷失当前位置,ftell( )就可以解决这个问题。
long& ftell(文件指针);
功能:返回文件位置指针的当前位置(用相对于文件头的位移量表示)。如果返回值为-1L,则表明调用出错。例如:
offset=ftell(fp);
if(offset= =-1L)printf(“ftell( )
error\n”);
六、出错检测
1、ferror( )函数
在调用输入输出库函数时,如果出错,除了函数返回值有所反映外,也可利用ferror()函数来检测。
&&&&&&&&&&&
int& ferror(文件指针);
功能:如果函数返回值为0,表示未出错;如果返回一个非0值,表示出错。
&&& (1)对同一文件,每次调用输入输出函数均产生一个新的ferror( )函数值。因此在调用了输入输出函数后,应立即检测,否则出错信息会丢失。
(2)在执行fopen( )函数时,系统将ferror( )的值自动置为0。
2、clearerr( )函数
void& clearerr(文件指针);
功能:将文件错误标志(即ferror( )函数的值)和文件结束标志(即feof( )函数的值)置为0。对同一文件,只要出错就一直保留,直至遇到clearerr( )函数或rewind( )函数,或其它任何一个输入输出库函数。

我要回帖

更多关于 c void 的文章

 

随机推荐