C语言-第十章
c语言 ●第10章 指针-1
…
19
2.定义时同时赋值
int a[10];
int *p=a; c规定: /* 相当于int *p=&a[0] */
若有 int a[10];
int *p=a; 则 p+1:指向下一个数组元素。
…
p+i:其指向下移i个元素。
20
说明:若有 int a[10]; int *p=a; (1) p+i *(p+i) = &a[i] a[i]= a+i *(a+i) (2)数组的指针变量也可带下标 a[i] ,p[i], *(a+i),*(p+i) 是等价的。 (3)a与p的区别:a代表数组a的首地址,是常量。 p=a; p也代表数组a的首地址,是变量。 如:p++; 是正确的,而 a++; 是错误的。 (4)引用数组元素有三种方法: 下标法: a[i]或p[i] 地址法:*(a+i) 效率低 指针法:*(p+i) *p++ 效率高
13
讨论: 若将被调函数swap( )改为: swap(int *p1,int *p2) {int *p; *p=*p1; *p1=*p2; *p2=*p; /*中间变量是指针变量所指的对象*/ } p无确定的地址(地址是随机的),可能指向任何单 元,有可能破坏系统(乱放枪)。加上int c;p=&c;就没 有问题了。
3 6 9 …
i j k
2004
3010
2000
i_pointer
3
二.对内存单位的访问 存数—写 取数—读 对内存单位的访问,是通过地址进行的。 如: printf(“%d”,i); 读 再如:scanf(“%d”,&i); 写 直接访问:按变量的地址直接读写变量的值。 如:k=i+j; (1)从2000开始的内存单元中取出i的值3. (2)从2002开始的内存单元中取出j的值6. (3)相加后,送入2004开始的内存单元。 间接访问:将变量a的地址存入另一变量b中,访问a时,先 找b,取出a的地址,再按此地址访问a。
c语言第10章指针
3.间接引用指针
间接引用指针时,可获得由该指针变量所指向的变量内容。
例如,int i=10,*ip=&i;
ip
i
cout<<*ip<<endl;
0000:F384 0000:F384 210
运行结果为:10 即指针ip所指向的变量i的内容。
*放在定义过的指针变量之前,称为间接引用操作符; *放在指针变量定义中时,称为指针定义符。 非指针变量不能用间接引用操作符,*只能作用于地址。
例如, double d=1.23,*dp; char c,*cp;
在&和cp*=作&d用; 下,对变量d和dp有如下6种操作: 其d,中d,dpp,=*&d*是cd; ,非*法dp的,;&&d指,dp针&是只d指p能。针指的向地与址其即同二类级型指的针量。 另外,指针除了可指向所有基本类型的变量外,指针也可 指向常量、数组、数组元素、函数、指针以及文件等。
int ii=n1t0;b, a[10]; int *inpt=&*pi;1,//*初p2始; 化为整型变量的地址,但 *ip=p&1=i;&//是b;错误的
注意:p2不=p要1将; “//可in以t *将ip=一&个i;”已与赋“值*i的p=指&i针;”混赋淆给。另一个相同类型的指针 前者是p2定=&义a语[5句];,*是指针定义符,系统为指针变量ip分配一个空间, 并2、用i数的地组址的值地初址始值化;可后用者该是数执组行语的句数,组左名右表两边示类。型例不如匹:配。 指 例3、针如变,ip函n=d*d量t数bodob;up在u的b=b[3使ll6ee].地8[用*d;4d=址]前/p2,/!(;.,*5值;p一)由[定4该]要; 函被数$赋$$以的d$:p一$名$个$字$地来址表值$$$,示$:否$。$$则$例是如很#6某#:危.#8变险量的。 没有被do赋ub值le的s指in针(d变ou量bdlep的x值);是一个随机地址,把6.8赋给内存中的 随机位do置ub,le很(可*p能f)破( 坏); 了另一个变量,甚至修改了栈中的函数返回 地址,pf造=s成in计; 算机死机或进入死循环。
C语言程序设计第10章文件及其应用
学一学
1.定义文件指针 一般形式为: FILE * fp; 其中fp就是所定义文件指针。 FILE类型 以及所有的文件读写函数和相关常量都定 义在文件stdio.h中,在源程序的开头要 包含头文件 stdio.h 。
学一学
2.打开文件 C语言中,使用fopen函数来打开文件。打开文件是使 一个文件指针变量指向被打开文件的结构变量,以便通 过该指针变量访问打开的文件。fopen函数的调用形式 如下: fopen(chFileName,mode); 以mode 方式打开文件chFileName。其中,参数 chFileName 是将要读写文件的文件名,mode为文件 的操作方式。若文件打开成功,返回一个文件指针,若 打开失败,则返回空值NULL,NULL在stdio.h中被定 义为0。文件操作方式mode是一个整数,其取值及含 义如表10-1所示。
流程图
开始 定义文件指针fp,定义整型数组 iArray[5],定义循环变量i 以写二进制文件方式打开文件 fp=fopen("test.dat","wb") N i=0
fp==NULL Y
i<5 Y 输入1个整数存入 数组元素iArray[i]
N
i++
把数组iArray中5 个整数写入文件
显示出错信息 关闭文件 exit(0)
试一试
问题10.1编一程序从键盘输入一串字符“may friendship forever! ”,然后保存在文件myInfo.txt中。 【解题步骤】 1.定义文件指针fp; 2.定义字符数组chInfo用来存输入的字符串; 3.以写文本文件方式打开文件myInfo.txt; 4.如果打开文件失败,则输出错误信息并结束程序; 5.否则,打开文件成功,则从键盘输入数据; 5.将字符数组chInfo中的字符写入文件myInfo.txt; 6.关闭文件。
《C语言程序设计》第十章位运算(完)
运行结果: a and b:0x81 a and b:0xbb a and b:0x3a
1 0 1 1 1 0 0 1 a:0xb9 a&b 1 0 0 0 0 0 1 1 b:0x83
1 0 0 0 0 0 0 1 结果:0x81
1 0 1 1 1 0 0 1 a:0xb9 a|b 1 0 0 0 0 0 1 1 b:0x83
unsigned char b=248 b>>2 1 1 1 1 1 0 0 0
补零
00111110
舍弃
不带符号的操作数右移位时,左端出现的空 位补零。
unsigned char b=248 b>>2 1 1 1 1 1 0 0 0
补零
00111110
舍弃
说明:
4) 每右移一位相当于操作数除2。 5) a>>2,b>>2形式的操作并不改变操作数a,b
b=a<<2 舍弃
0 0 0 1 1 0 1 1 a:0x1b
0 1 1 0 1 1 0 0 b:0x6c 补零
不带符号的操作数右移位时,左端出现的空 位补零。
带符号的操作数右移位时,左端出现的空位 按原最左端的位复制,无论什么操作数,移 出右端的位被舍弃。
例[10-4]:右移位操作。
void main(){ char a=-8; unsigned char b=248; printf("signed a right_shift 2 bit:%d\n", a>>2 ); printf("unsigned b right_shift 2 bit:%d\n", b>>2 ); }
c语言第10章 结构体
李晓勇
lxyonghn@ 信息与电子工程学院
内容
结构体类型定义
结构体变量的定义 结构体变量的引用 结构体变量的初始化 结构数组 结构体和指针 结构体与函数 链表
C语言程序设计 - c语言第8章 结构体 语言第8
2
一, 结构体类型定义 结构体是一种构造数据类型 结构体是一种构造数据类型 用途:把不同类型的数据组合成一个整体-------自定义数据 用途:把不同类型的数据组合成一个整体 自定义数据 类型 结构体类型定义 struct [结构体名 结构体名] 结构体名 { 成员名; 类型标识符 成员名; 类型标识符 成员名; 成员名; ……………. }; ;
num 间接定义法 struct student { int num; char name[20]; char sex; int age; }; struct student stu[2]; 25B name sex age num name sex age stu[1] stu[0]
C语言程序设计 - c语言第8章 结构体 语言第8
C语言程序设计 - c语言第8章 结构体 语言第8
13
六, 结构体和指针
指向结构体变量的指针
定义形式: 结构体指针名; 定义形式:struct 结构体名 *结构体指针名 结构体指针名
例 struct student *p; 使用结构体指针变量引用成员形式 struct (*结构体指针名 成员名 结构体指针名).成员名 结构体指针名->成员名 结构体变量名.成员名 结构体指针名 student 结构体指针名 p成员名 结构体变量名 成员名 num { int num; name char name[20]; stu sex char sex; 例 int n; struct student stu1; int *p=&n; int age; age struct student *p=&stu1; *p=10; }; n=10 stu1.num=101; (*p).num=101 struct student stu ,*p=&stu; p->num=101
C语言全国计算机二级等级考试教程第10章 字符串(章节带习题)
输出时直到遇第一 char str[ ]=“I love you!” , *p=str; 个‘\0‟结束输出。 字符指针变量 printf(“%s\n” , p); 字符数组名
输入项 字符指针变量
转去介绍
10.3 字符串的输入和输出
字符数组名
输入项
字符指针变量 当字符数组名作为输入项: char str[15]; scanf(“%s”,str); 在内存中的形式是: P R 输入形式为: PROGRAMMING<CR> O G R A M M I N Ga赋初值后的存储示意图
10.4 字符串数组
可以定义字符型指针数组并通过赋初值来构成一个类似的字符串数组。 例如:char *pa[3]={“a”, ”bb”, ”ccc”}; 定义了一个字符型指针数组,该数组中含有3个元素pa[0] 、pa[1]、 pa[2],且每一个 元素都是一个指向字符串的指针。
则在str中存入的只是字符串“APROGRAM”,而不是字符串“APROGRAM MING
10.3 字符串的输入和输出
10.3.3 调用gets、puts函数在终端输入或输出一行字符串
调用gets函数来输入字符串,例如: char str[15]; gets( str ); 在内存中的形式是: A P 若从键盘上依次输入: APROGRAM MING<CR> R O G R A M M I N G \0 \0
★ 两个字符串分别占有不同的存储空间。 ★ 指针变量pmark中的地址可以改变而指向另外一个长度 不同的字符串。
10.3 字符串的输入和输出
10.3.1 输入和输出字符串时的必要条件
输入和输出的格式说明符为 %s 对字符串输入输出时的必要条件: 字符串常量 输出项 字符数组名 printf(“%s\n” , ”I love you!”); char str[ ]=“I love you!”; printf(“%s\n” , str); I love you!
C语言 选择题库第10章 结构体与共用体
第10章结构体与共用体1.以下叙述中错误的是()。
A) 可以通过typedef增加新的类型B) 可以用typedef将已存在的类型用一个新的名字来代表C) 用typedef定义新的类型名后,原有类型名仍有效D) 用typedef可以为各种类型起别名,但不能为变量起别名参考答案:A【解析】关键字typedef的作用只是将C语言中的已有的数据类型作了置换,并不是增加新的类型,所以A)错误。
2.以下关于typedef的叙述错误的是A) 用typedef可以增加新类型B) typedef只是将已存在的类型用一个新的名字来代表C) 用typedef可以为各种类型说明一个新名,但不能用来为变量说明一个新名D) 用typedef为类型说明一个新名,通常可以增加程序的可读性参考答案:A【解析】typedef并不是增加了新类型,而是用一个新名字替代已存在的类型,不能为变量说明一个新名,使用typedef可以增强移植性。
所以A选项错误。
3.若有以下语句typedef struct S{ int g; char h; } T;以下叙述中正确的是A) 可用S定义结构体变量B) 可用T定义结构体变量C) S是struct 类型的变量D) T是struct S类型的变量参考答案:B【解析】本题考查typedef重新声明一种结构体类型,那么T为结构体类型,而不是结构体变量,所以B选项正确。
4.设有以下语句typedef struct TT{ char c; int a[4]; } CIN;则下面叙述中正确的是A) CIN是struct TT类型的变量B) TT是struct类型的变量C) 可以用TT定义结构体变量D) 可以用CIN定义结构体变量参考答案:D【解析】本题考查typedef重新声明一种结构体类型,其中CIN为结构体类型名,而不是结构体变量,所以D 选项正确。
5.以下叙述中错误的是A) 可以用typedef将已存在的类型用一个新的名字来代表B) 可以通过typedef增加新的类型C) 用typedef定义新的类型名后,原有类型名仍有效D) 用typedef可以为各种类型起别名,但不能为变量起别名参考答案:B【解析】本题考查typedef的用法,typedef并不是增加一种新的类型,而是对已存在的类型用一个新的名字来代表,所以B选项错误。
《C语言》章节列表
第1章程序设计和C语言1第2章算法——程序的灵魂16第3章最简单的C程序设计——顺序程序设计第4章选择结构程序设计85第5章循环结构程序设计114第6章利用数组处理批量数据1426.1怎样定义和引用一维数组1426.1.1怎样定义一维数组1436.1.2怎样引用一维数组元素1446.1.3一维数组的初始化1456.1.4一维数组程序举例1466.2怎样定义和引用二维数组1486.2.1怎样定义二维数组1496.2.2怎样引用二维数组的元素1506.2.3二维数组的初始化1516.2.4二维数组程序举例1526.3字符数组1546.3.1怎样定义字符数组1546.3.2字符数组的初始化1556.3.3怎样引用字符数组中的元素1556.3.4字符串和字符串结束标志1566.3.5字符数组的输入输出1596.3.6使用字符串处理函数1616.3.7字符数组应用举例165习题168第7章用函数实现模块化程序设计1707.1为什么要用函数1707.2怎样定义函数1727.2.1为什么要定义函数1727.2.2定义函数的方法1737.3调用函数1747.3.1函数调用的形式1747.3.2函数调用时的数据传递1757.3.3函数调用的过程1777.3.4函数的返回值1787.4对被调用函数的声明和函数原型1797.5函数的嵌套调用1827.6函数的递归调用1847.7数组作为函数参数1927.7.1数组元素作函数实参1937.7.2数组名作函数参数1947.7.3多维数组名作函数参数1977.8局部变量和全局变量1997.8.1局部变量1997.8.2全局变量2007.9变量的存储方式和生存期2047.9.1动态存储方式与静态存储方式2047.9.2局部变量的存储类别2057.9.3全局变量的存储类别2087.9.4存储类别小结2127.10关于变量的声明和定义2147.11内部函数和外部函数2157.11.1内部函数2157.11.2外部函数215习题218第8章善于利用指针2208.1指针是什么2208.2指针变量2228.2.1使用指针变量的例子2228.2.2怎样定义指针变量2238.2.3怎样引用指针变量2248.2.4指针变量作为函数参数2268.3通过指针引用数组2308.3.1数组元素的指针2308.3.2在引用数组元素时指针的运算2318.3.3通过指针引用数组元素2338.3.4用数组名作函数参数2378.3.5通过指针引用多维数组2458.4通过指针引用字符串2558.4.1字符串的引用方式 2558.4.2字符指针作函数参数2598.4.3使用字符指针变量和字符数组的比较263 8.5指向函数的指针2668.5.1什么是函数指针2668.5.2用函数指针变量调用函数2668.5.3怎样定义和使用指向函数的指针变量268 8.5.4用指向函数的指针作函数参数2708.6返回指针值的函数2748.7指针数组和多重指针2778.7.1什么是指针数组 2778.7.2指向指针数据的指针2808.7.3指针数组作main函数的形参2828.8动态内存分配与指向它的指针变量2858.8.1什么是内存的动态分配2858.8.2怎样建立内存的动态分配2858.8.3void指针类型 2878.9有关指针的小结288习题291第9章用户自己建立数据类型2939.1定义和使用结构体变量2939.1.1自己建立结构体类型2939.1.2定义结构体类型变量 2959.1.3结构体变量的初始化和引用2979.2使用结构体数组3009.2.1定义结构体数组3009.2.2结构体数组的应用举例3019.3结构体指针3039.3.1指向结构体变量的指针3039.3.2指向结构体数组的指针3049.3.3用结构体变量和结构体变量的指针作函数参数306 9.4用指针处理链表3099.4.1什么是链表 3099.4.2建立简单的静态链表3109.4.3建立动态链表3119.4.4输出链表3159.5共用体类型3179.5.1什么是共用体类型3179.5.2引用共用体变量的方式3189.5.3共用体类型数据的特点3199.6使用枚举类型3239.7用typedef声明新类型名326习题330第10章对文件的输入输出33110.1C文件的有关基本知识33110.1.1什么是文件33110.1.2文件名33210.1.3文件的分类33210.1.4文件缓冲区33310.1.5文件类型指针33310.2打开与关闭文件33510.2.1用fopen函数打开数据文件33510.2.2用fclose函数关闭数据文件33710.3顺序读写数据文件33810.3.1怎样向文件读写字符33810.3.2怎样向文件读写一个字符串34110.3.3用格式化的方式读写文件34410.3.4用二进制方式向文件读写一组数据34510.4随机读写数据文件34910.4.1文件位置标记及其定位34910.4.2随机读写 35210.5文件读写的出错检测353习题354第11章常见错误分析355附录370附录A在Visual C++ 6.0环境下运行C程序的方法370附录B常用字符与ASCII代码对照表377附录CC语言中的关键字378附录D运算符和结合性378附录EC语言常用语法提要380附录FC库函数384参考文献390第4章选择结构程序设计854.1选择结构和条件判断854.2用if语句实现选择结构874.2.1用if语句处理选择结构举例874.2.2if语句的一般形式 894.3关系运算符和关系表达式914.3.1关系运算符及其优先次序914.3.2关系表达式924.4逻辑运算符和逻辑表达式924.4.1逻辑运算符及其优先次序934.4.2逻辑表达式944.4.3逻辑型变量964.5条件运算符和条件表达式974.6选择结构的嵌套1004.7用switch语句实现多分支选择结构1024.8选择结构程序综合举例106习题112第5章循环结构程序设计1155.1为什么需要循环控制1155.2用while语句实现循环1165.3用do…while语句实现循环1185.4用for 语句实现循环1215.5循环的嵌套1255.6几种循环的比较1265.7改变循环执行的状态1265.7.1用break语句提前终止循环1275.7.2用continue语句提前结束本次循环1285.7.3break语句和continue语句的区别1295.8循环程序举例132习题141第6章利用数组处理批量数据1436.1怎样定义和引用一维数组1436.1.1怎样定义一维数组1446.1.2怎样引用一维数组元素1456.1.3一维数组的初始化1466.1.4一维数组程序举例1476.2怎样定义和引用二维数组1496.2.1怎样定义二维数组1506.2.2怎样引用二维数组的元素1516.2.3二维数组的初始化1526.2.4二维数组程序举例1536.3字符数组1556.3.1怎样定义字符数组1556.3.2字符数组的初始化1566.3.3怎样引用字符数组中的元素156 6.3.4字符串和字符串结束标志1576.3.5字符数组的输入输出1606.3.6使用字符串处理函数1626.3.7字符数组应用举例166习题169第7章用函数实现模块化程序设计171 7.1为什么要用函数1717.2怎样定义函数1737.2.1为什么要定义函数1737.2.2定义函数的方法1747.3调用函数1757.3.1函数调用的形式1757.3.2函数调用时的数据传递1767.3.3函数调用的过程1787.3.4函数的返回值1797.4对被调用函数的声明和函数原型181 7.5函数的嵌套调用1837.6函数的递归调用1857.7数组作为函数参数1937.7.1数组元素作函数实参1937.7.2数组名作函数参数1957.7.3多维数组名作函数参数1987.8局部变量和全局变量2007.8.1局部变量2007.8.2全局变量2017.9变量的存储方式和生存期2057.9.1动态存储方式与静态存储方式205 7.9.2局部变量的存储类别2067.9.3全局变量的存储类别2097.9.4存储类别小结2137.10关于变量的声明和定义2157.11内部函数和外部函数2167.11.1内部函数2167.11.2外部函数216习题219第8章善于利用指针2218.1指针是什么2218.2指针变量2238.2.1使用指针变量的例子2238.2.2怎样定义指针变量2248.2.3怎样引用指针变量2258.2.4指针变量作为函数参数2278.3通过指针引用数组2328.3.1数组元素的指针2328.3.2在引用数组元素时指针的运算2338.3.3通过指针引用数组元素2348.3.4用数组名作函数参数2398.3.5通过指针引用多维数组2478.4通过指针引用字符串2578.4.1字符串的引用方式 2578.4.2字符指针作函数参数2618.4.3使用字符指针变量和字符数组的比较265 8.5指向函数的指针2688.5.1什么是函数指针2688.5.2用函数指针变量调用函数2688.5.3怎样定义和使用指向函数的指针变量270 8.5.4用指向函数的指针作函数参数2728.6返回指针值的函数2768.7指针数组和多重指针2798.7.1什么是指针数组 2798.7.2指向指针数据的指针2828.7.3指针数组作main函数的形参2848.8动态内存分配与指向它的指针变量2878.8.1什么是内存的动态分配2878.8.2怎样建立内存的动态分配2878.8.3void指针类型 2898.9有关指针的小结290习题293第9章用户自己建立数据类型2959.1定义和使用结构体变量2959.1.1自己建立结构体类型2959.1.2定义结构体类型变量 2979.1.3结构体变量的初始化和引用2999.2使用结构体数组3029.2.1定义结构体数组3029.2.2结构体数组的应用举例3049.3结构体指针3059.3.1指向结构体变量的指针3059.3.2指向结构体数组的指针3069.3.3用结构体变量和结构体变量的指针作函数参数3089.4用指针处理链表3119.4.1什么是链表 3119.4.2建立简单的静态链表3129.4.3建立动态链表3139.4.4输出链表3179.5共用体类型3199.5.1什么是共用体类型3199.5.2引用共用体变量的方式3209.5.3共用体类型数据的特点3219.6使用枚举类型3259.7用typedef声明新类型名328习题332第10章对文件的输入输出33310.1C文件的有关基本知识33310.1.1什么是文件33310.1.2文件名33410.1.3文件的分类33410.1.4文件缓冲区33510.1.5文件类型指针33510.2打开与关闭文件33710.2.1用fopen函数打开数据文件33710.2.2用fclose函数关闭数据文件33910.3顺序读写数据文件34010.3.1怎样向文件读写字符34010.3.2怎样向文件读写一个字符串34310.3.3用格式化的方式读写文件34610.3.4用二进制方式向文件读写一组数据34710.4随机读写数据文件35110.4.1文件位置标记及其定位35110.4.2随机读写 35410.5文件读写的出错检测355习题356第11章常见错误分析374附录390附录A在Visual C++ 6.0环境下运行C程序的方法390 附录CC语言中的关键字398附录D运算符和结合性398附录EC语言常用语法提要400附录FC库函数404参考文献410。
精品课件-程序设计基础(C语言)(杨俊清)-第10章
第10章 文 件
typedef struct {
shortlevel; 的程度*/
unsigned flags; charfd; unsigned charhold; 读取字符*/ shortb size; unsigned char*buffer; 置*/ unsignedar *curp; unsigned istemp; short token;
if ((fp=fopen("file1","r"))==NULL) {
printf("cannot open this file\n"); exit(0); }
第10章 文 件
即先检查打开的操作有否出错,如果有错就在终端上输出 “cannot open this file”。exit函数的作用是关闭所有文 件,终止正在调用的过程。待用户检查出错误,修改后再运行。
第10章 文 件
第10章 文 件
10.1 文件概述 10.2 文件的读写 10.3 文件定位 习题
第10章 文 件
10.1 文 件 概 述 文件(file)是程序设计中一个重要的概念。所谓“文 件”,一般指存储在外部介质上数据的集合。一批数据是以文 件的形式存放在外部介质(如磁盘)上的。操作系统是以文件为 单位对数据进行管理的,也就是说,如果想找存在外部介质上 的数据,必须先按文件名找到所指定的文件,然后再从该文件 中读取数据。要向外部介质上存储数据,也必须先建立一个文 件(以文件名标识),才能向它输出数据。
第10章 文 件
说明: (1) 用“r”方式打开的文件只能用于向计算机输入而不 能用作向该文件输出数据,而且该文件应该已经存在。不能用 “r”方式打开一个并不存在的文件(即输入文件),否则出错。 (2) 用“w”方式打开的文件只能用于向该文件写数据 (即输出文件),而不能用来向计算机输入。如果原来不存在该 文件,则在打开时新建立一个以指定的名字命名的文件。如果 原来已存在一个以该文件名命名的文件,则在打开时将该文件 删去,然后重新建立一个新文件。 (3) 如果希望向文件末尾添加新的数据(不希望删除原有 数据),则应该用“a”方式打开。但此时该文件必须已存在, 否则将得到出错信息。打开时,位置指针移到文件末尾。
《C语言程序设计教程》(第三版)李凤霞 主编——第十章习题答案
习题十一、单选题1~5 DDDCC6~10 AABDB11~14 CADC二、填空题1、34 122、ARRAY a,b,c;3、1 34、a c5、(*b).day=? b->day=?5、分析下列程序执行结果。
#include “stdio.h”main(){static struct s1{char c[4],*s;s1={“abc”,”def”};static struct s2{char *cp;struct s1 ss1;}s2={“ghi”,{“jkl”,”mno”}};printf(“%c%c\n”,s1.c[0],*s1.s); /*output ab */printf(“%s%s\n”,s1.c,s1.s); /*output abcdef */printf(“%s%s\n”,s2.cp,s2.ss1.s); /*output ghimno */printf(“%s%s\n”,++s2.cp,++s2.ss1.s); /* output hino */}6、以下程序的功能是:读入一行字符(如:a,...,y,z),按输入时的逆序建立一个链式的结点序列,即先输入的位于链表尾(如下图),然后再按输入的相反顺序输出,并释放全部结点。
#define getnode(type)_________malloc(sizeof(type)) ( (struct node *))main(){struct node{char info;struct node *link;}*top,*p;char c;top=NULL;while((c=getchar())______________) (!='\n'){p=getnode(struct node);p->info=c;p->link=top;top=p;}while(top){_________________; (p=top)top=top->link;putchar(p->info);free(p);}}7、下面的函数将指针p2所指向的线性链表链接到p1所指向的的链表的末端。
高树芳C语言程序设计--第十章
[解决方案]定义结构体类型变量存储学生信息,
使用scanf从键盘输入数据,使用fprintf函数按格 式输出数据到文件(生成data3.txt文件)。
程序代码
10
10.2
文件的读写
相关知识:
1.文件的读写 2.格式化读写函数
11
10.2
文件的读写
[课堂训练10-1] 1.使用Windows的记事本建立一个文件,其 中写入15个任意整数,数据之间用逗号分隔。 编程输出该文件所有的奇数。 2.编程以只读方式打开案例10-3中的 data3.txt文件,在屏幕上输出所有学生的数 据。
第10章
文件
知识目标: 1. 理解文件和文件指针的概念 2.掌握文件的打开和关闭方法 3.掌握文件的读写操作 4.掌握文件的定位与随机读写操作
1
第10章 文件 能力目标: 1. 会打开和关闭文件 2.会对文件进行读写和定位等操作
本章内容: 文件的定义,文件型指针,文件的打开与关闭,文件 的读写,文件的定位与随机读写。
2
第10章 10.1 10.2 10.3 10.4
文件
文件的打开与关闭 文件的读写 文件的定位和随机读写 知识拓展
3
10.1 文件的打开与关闭
案例10-1
输出文件中的整数及其和
4
10.1 文件的打开与关闭
案例10-1 [案例任务]
输出文件中的整数及其和
使用Windows的记事本在磁盘上与C程序文件在同一目 录下建立一个文件名为“data1.txt”的文本文件(如 图10-1所示),以空格、制表符或回车为分隔符输入 任意个整数,设计C程序,以只读方式打开此文件,若 该文件不存在,则输出“不能打开文件!”,若打开 成功,则输出所有整数,以及整数的个数和它们之和。
C语言“字符串”
程序运行过程: How do you do?↙ How s=do,s1=you
□do? 注:□代表空格
C语言程序设计教程
第10章 字符串
12
10.1.4 字符串处理函数 C语言库函数中除了前面用到的库函数 gets()与puts()之外,还提供了一些常用的库 函数,其函数在string.h中 1.字符串拷贝函数:strcpy() 调用格式:strcpy(d_str,s_str); 功 能:将以s_str为起始地址的字符串或字 符串常量(连同‘\0’)复制到以d_str为起始地 址的、连续的内存中。 说 明:d_str在内存中所占的字节数应不 小于s_str在内存中所占的字节数。
第10章 字符串
1
第十章 字符串
10.1 字符数组与字符串 10.2 指针与字符串
2013/7/25
C语言程序设计教程
第10章 字符串
2
10.1 字符数组与字符串
10.1.1 字符数组的定义与初始化
1. 字符数组的定义 字符数组:其元素类型为字符类型的数组,其定义与前面介 绍的数组定义相同。 例如: char str[40]; 定义一个有40个元素的字符数组,每个元素相当于一个字 符变量。 char ch[5][30];
15
3.字符串比较函数strcmp()
调用格式:strcmp(str1,str2); 功能:若str1=str2,则函数返回值为0; 若str1>str2,则函数返回值为正整数; 若str1<str2,则函数值返回为负整数。 比较规则: ● 两个字符串自左至右逐个字符比较,直到出现不同字符 或遇到‘\0’为止。 ● 如字符全部相同且字符串的长度相等,则两个字符串相 等; 若出现不同字符,则遇到的第一对不同字符的ASCⅡ大者 为大,返回值为两者ASCII码值之差。 比较两字符串是否相等一般用以下形式: if (strcmp(str1,str2)==0){…}; 而 if(str1==str2){…};是错误的。
C语言第10章对文件的输入输出 ppt课件
PPT课件
11
10.1.1 什么是文件
➢从C程序的观点来看,无论程序一次读写 一个字符,或一行文字,或一个指定的数 据区,作为输入输出的各种文件或设备都 是统一以逻辑数据流的方式出现的。C语 言把文件看作是一个字符(或字节)的序 列。一个输入输出流就是一个字符流或字 节(内容为二进制数据)流。
PPT课件
20
10.1.3 文件的分类
ASCII形式
00110001 00110000 00110000 00110000 00110000
(1) (0) (0) (0) (0)
二进制形式
00000000 00000000 00100111 00010000
(10000)
PPT课件
21
10.1.4 文件缓冲区
的temp子目录下面
PPT课件
15
10.1.2 文件名
➢文件路径表示文文件件在名外部存储设备中的位 置。如:
D: \CC\temp\file1.dat 表示file1.dat文件存放在D盘中的CC目录下
的temp子目录下面
PPT课件
16
10.1.2 文件名
➢文件路径表示文命 识件名 符在规 的外则 命部遵 名存循 规储标 则设备中的位 置。如:
➢“文件”指存储在外部介质上数据的集合
一批数据是以文件的形式存放在外部介质上的 操作系统是以文件为单位对数据进行管理 想找存放在外部介质上的数据,先按文件名找
到所指定的文件,然后再从该文件读数据 要向外部介质上存储数据也必须先建立一个文
件(以文件名作为标志),才能向它输出数据
C语言开发基础教程(Dev-C++) 第10章 文件操作
✎
10.3.2 单行读写文件
2、fputs()函数
FILE *fp;
fp = fopen("D:\\test.txt","r+"); //以读写模式打开文件
fputs("China",fp);
✎
10.1.2 文件
总体来说,二进制文件较小,生成的速度 快,加载的速度也快,但文件内容往往需 要解析才可读。文本文件相对较大,生成 与加载的速度比二进制文件要慢,但文本 文件无需任何转换就可以看到其内容。
✎
10.1.3 文件指针
在C语言中,所有的文件操作都必须依靠指针来完成,因此如果要对文件 进行操作,必须先定义指向文件的指针,然后通过文件指针完成对文件 的操作。 文件指针的定义格式如下: FILE *变量名; FILE *fp; //定义文件指针fp
✎
10.2 文件的打开和关闭
文件正常打开时,函数返回指 向该文件的文件指针;文件打 开失败时,函数返回NULL。一 般在调用该函数之后,为了保 证程序的健壮性,会进行一次 判空操作。
FILE* fp;
//定义文件指针
fp=fopen(“D:\\test.txt”,“r”);
if(fp==NULL) //判空操作
程序
内存 输出文件缓冲区
输出
输出
输入 输入文件缓冲区 输入
磁盘
✎
10.2 文件的打开和关闭
文件最基本的操作就是打开和 关闭,在对文件进行读写之前, 需要先打开文件;读写结束之 后,则要及时关闭文件。
✎
10.2 文件的打开和关闭
1、打开文件 fopen()函数用于打开一个文件。 FILE* fopen(char* filename,char* mode); 返回值类型FILE*表示该函数返回值为文件指针类型;参数filename用于 指定文件的绝对路径,即用来确定文件包含路径名、文件名主干和扩展名 的唯一标识;参数mode用于指定文件的打开模式,函数的返回值为一个 文件类型的指针,如果文件打开失败,则返回空指针。
第十章 指针指针是C语言中广泛使用的一种数据类型. 运用指针.
int *p; p=1000;
被赋值的指针变量前不能再加“*”说明符,如写为*p=&a 也是 错误的。
3、指针变量的引用
欲穷千里,更上层楼
两个指针运算符: (1)取地址运算符:& (2)取内容运算符:*
例如: &a为变量a的地址,*p为指针变量p所指向的变 量
#include ”stdio.h”
#include “conio.h”
表示对数组元素a[2]赋以值1
C规定p+1指向下一个元素(实际含义为p+1*d,d为一个数组元素 所占字节数)
如果p的初值为&a[0],则:
p+i和a+i就是a[i]的地址,或者说它们指向a数组的第i元素
*(p+i) 或*(a+i)是p+i或a+i所指向的数组元素,即a[i]。
p a数组
a[0]
p+1,a+1
a[1]
p+i,a+i
*(p+i)
a[i]
p+9,a+9
a[9]
欲穷千里,更上层楼
p,a,&a[0]均指向同一单 元,它们是数组a的首地 址,也是第0 元素a[0]的 地址。
p+1,a+1,&a[1]均指向 第1元素a[1]。类推可知 p+i,a+i,&a[i]指向第i元素 a[i]。
应该说明的p是变量, 而a,&a[i]都是常量。在 编程时应予以注意。
2)在讲述一维数组时候我们曾经提到: 因为: a[i]和*(a+i) 等价! 所以: a[i]+j= =*(a+i)+j= =&a[i][j]
C语言程序设计第10章 编译预处理简明教程PPT课件
(2)定义一个宏名字之后,可以在其他宏定义中使用它。 如: #define ONE 1 #define TWO ONE+1 #define THREE ONE+TWO
计算机科学与技术学院—— C语言程序设计
10.2 #define
例10-1 宏定义及其使用 #define MESSAGE “You are right!\n”
计算机科学与技术学院—— C语言程序设计
第十章 编译预处理 内容提要
C预处理程序 #define
#include
条件编译指令
#undef
计算机科学与技术学院—— C语言程序设计
10.3 #include
10.3 #include
程序中的#include指令要求编译程序读入另一个源文件。被读入 文件的名字必须由双引号(”)或一对尖括号(<>)包围。如: #include”stdio.h” 或 #include<stdio.h> 都令编译程序读入并编译用于I/O函数处理的包含文件stdio.h。
计算机科学与技术学院—— C语言程序设计
10.3 #include
说明: (1)包含文件中还可以包含其它文件,称为嵌套包含(nested includes)。允许的最大嵌套深度随编译程序而变。 (2)用尖括号包围头文件时,搜索头文件时按编译程序的预先定 义进行,一般只搜索某些专门放置包含头文件的特殊目录。当头 文件用双引号包围时,搜索按编译程序实现时的规定进行,一般 指搜索当前目录,如未发现头文件,则再按尖括号包围时的办法 重新搜索。
10.2 #define
(4)#define指令还有一个重要功能:宏名字可以有变元。每当遇 到宏名字时,与之有关的变元都由程序中的实际变元替换。如上 例中的#define ABS(a) (a)<0?-(a):(a)。但要注意,#define ABS(a) (a)<0?-(a):(a)中变元a两边的括号是不能少的,否则, 会产生非预期结果。如: #define ABS(a) a<0?-a:a printf(”abs of (10-20):%d\n”,ABS(10-20)); ABS(10-20)替换为:10-20<0?-10-20:10-20,则输出结果为-30。
c语言第10章文件练习题
fclose(f1); fclose(f2);} 5. 以下程序中用户由键盘输入一个文件名,然后输入一串字符(用#结束输入)存放到此
文件文件中形成文本文件,并将字符的个数写到文件尾部,请填空。 #include<stdio.h> main( ) {
FILE *fp; char ch,fname[32]; int count=0; printf("Inputthefilename:"); scanf("%s",fname); if((fp=fopen(【1】,"w+"))==NULL) {printf("Can'topenfile:%s\n",fname); exit(0);} printf("Enterdata:\n"); while((ch=getchar())!="#") { fputc(ch,fp); count++;} fprintf(【2】 ,"\n%d\n", count); fclose(fp); } 6. 以下程序的功能是:从键盘上输入一个字符串,把该字符串中的小写字母转换为大写字 母,输出到文件 test.txt中,然后从该文件读出字符串并显示出来。请填空。 #include<stdio.h> main() {
第 10章 文件练习题
一、 选择题
1. 对 C语言的文件存取方式中,文件()。
A.只能顺序存取
B.只能随机存取(也称直接存取)
C.可以是顺序存取,也可以是随机存取
D.只能从文件的开头存取
2. C语言可以处理的文件类型是()。
A.文本文件和数据文件
B.文本文件和二进制文件
c语言基础教程-第十章------文件和读写函数
C语言基础教程文件和文件指针1.文件一般说来,文件是有序数据的集合。
程序文件是程序代码的有序集合,数据文件是一组数据的有序集合。
文件是被存放在外部存储设备中的信息。
对文件的处理过程就是面向文件的输入和输出过程。
文件的输入过程是从文件中读出信息,文件的输出过程是往文件中写入信息,文件的输入的过程使用读函数,实现文件输出的过程使用写函数。
文件的读写函数是实现文件操作的主要函数,本章将用大量篇幅来讲述文件的读写函数。
C语言文件被称为流式文件,其特点是不分记录或块,将文件看成是信息"流"或看成是一个字符流(文本文件),或看成是一个二进制流(二进制文件).文件的存取是以字符(字节)为单位的,读写数据流的开始和结束受程序控制。
任何一个文件都是以EOF结束,最简单的文件是只有结束符的空文件。
C语言文件包含有设备文件和磁盘文件,例如,键盘是一种输入信息的文件,显示器屏幕和打印机是输出信息的文件它们都属于设备文件。
将内存的信息放到磁盘上保存,需要时再从磁盘上装入内存,这就要使用磁盘文件,磁盘文件是计算机中常用的文件nC语言文件按存放设备分设备文件和磁盘文件;按数据的组织形式分为文本文件(ASCII码文件)和二进制文件。
文本文件是按一个字节存放一个字符的ASCII码来存放的;二进制文件是按数据在内存中的存储形式放到磁盘上的。
例如,有一个整数10000,在内存中按二进制形式存放,占2个字节,将它放在磁盘上如按文本文件形式存放,占5个字节,每个数位占一个字节。
两种存放方式各有利弊。
以文本文件形式输出便于对字符进行处理,也便于输出字符,但是占用存储空间较多,并且要花费转换时间。
以二进制文件形式输出可节省存储空间和转换时间,但是不能直接输出字符形式。
2.文件指针文件指针是一种用来指向某个文件的指针。
如果说某个文件指针指向某个文件,则是该文件指针指向某个文件存放在内存中的缓冲区的首地址。
每一个被使用的文件都要在内存中开辟一个区域,用来存放的有关信息,包括文件名字、文件状态和文件当前位置等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
文件特点:
你现在所处的位置在:首页 C语言教学 幻灯片版 第十章 文件
文本文件特点: 存储量大、速度慢、便于对字符操作
如 int型数10000 ASCII形式 0011000100110000001100000011000000110000 0010011100010000 0010011100010000 内存存储形式 二进制形式
输出文件缓冲区 缓冲区
4
你现在所处的位置在:首页 C语言教学 幻灯片版 第十章 文件
10.2 文件类型指针
文件结构体FILE
缓冲文件系统为每个正使用的文件在内存开辟文件信 息区 文件信息用系统定义的名为FILE的结构体描述 FILE定义在stdio.h中 typedef struct { int _fd; int _cleft; int _mode; char *_next; char *_buff; }FILE;
打开文件fopen
char *filename=“c:\\fengyi\\bkc\\test.dat” 标准输出------显示器 stdout exit(0); fp= fopen (“c:\\fengyi\\bkc\\test.dat”,”r”); “w+/wb+” (读写) fopen(filename,”r”); 为读/写建立一个文本/二进制文件 fp= } 标准出错输出-----显示器 stderr “a+/ab+” (读写) 为读/写打开或建立一个文本/二进制文件 使用文件方式 函数原型: FILE *fopen(char *name,char *mode) 功能:按指定方式打开文件 要打开的文件名 返值:正常打开,为指向文件结构体的指针;打 开失败,为NULL 7
你现在所处的位置在:首页 C语言教学 幻灯片版 第十章 文件
void display() #include <stdio.h> { {FILE *fp; FILE *fp; #define SIZE 2 int i; i; int struct student_type if((fp=fopen("d:\\fengyi\\exe\\stu_dat","wb"))==NULL) if((fp=fopen("d:\\fengyi\\exe\\stu_dat","rb"))==NULL) { char name[10]; { { printf("cannot open file\n"); printf("cannot open file\n"); int num; return; return; int age; }} char addr[15]; for(i=0;i<SIZE;i++) for(i=0;i<SIZE;i++) }stud[SIZE]; if(fwrite(&stud[i],sizeof(struct student_type),1,fp)!=1) { fread(&stud[i],sizeof(struct student_type),1,fp); main() printf("file write error\n"); printf("%-10s %4d %4d %-15s\n",stud[i].name, { fclose(fp); stud[i].num,stud[i].age,stud[i].addr); int i; } for(i=0;i<SIZE;i++) } fclose(fp); scanf("%s%d%d%s",stud[i].name,&stud[i].num, } &stud[i].age,stud[i].addr); save(); display(); }
#include <stdio.h> 例 从键盘输入字符,逐个 #include <stdio.h> main() 存到磁盘文件中,直到 main() FILE *in, {{ FILE *fp; *out; 输入‘#“为止 判断二进制文件是否结束 char ch,infile[10],outfile[10]; char ch,*filename=“out.txt”; #include <stdio.h> while(!feof(fp)) scanf("%s",infile); if((fp=fopen(filename,"w"))==NULL) main() Ch12_1.c {printf("cannot open c=fgetc(fp); {scanf("%s",outfile); file\n"); { FILE *fp; if ((in =…….. fopen(infile, "r"))== NULL) exit(0); 例 读文本文件内容, char ch,*filename=“out.txt”; } { printf("Cannot open infile.\n"); } if((fp=fopen(filename,”r"))==NULL) 并显示 exit(0); printf("Please inputopen file\n"); { printf("cannot string:"); } ch=getchar(); 例 文件拷贝 exit(0); feof if ((out = fopen(outfile, "w"))== NULL) while(ch!='#') } 函数原型: int feof(FILE *fp)open outfile.\n"); { printf("Cannot fputc(ch,fp); { while((ch=fgetc(fp))!=EOF) Ch12_2.c 功能:判断文件是否结束 exit(0); putchar(ch); 返值:文件结束,返回真(非0);文件未结束,返 } ch=getchar(); fclose(fp); 判断文本文件是否结束 回0 while (!feof(in)) }} fputc(fgetc(in), out); fclose(fp); } fclose(in); fclose(out); 10 }
文件关闭fclose
作用:使文件指针变量与文件“脱钩”,释放文件结构 体和文件指针 函数原型:int fclose(FILE *fp) 功能:关闭fp指向的文件 返值:正常关闭为0;出错时,非0 文件打开时返回的文件类型指针
缓冲文件系统:
不关闭文件可能会丢失数据
磁盘文件
输入文件缓冲区 程序数据区 a
例 从键盘输入4个学生数据,把他们转存到磁盘文件中 Ch12_3.c void save() 去
13
你现在所处的位置在:首页 C语言教学 幻灯片版 第十章 文件
格式化I/O:fprintf与fscanf
#include <stdio.h> 函数原型: main() int fprintf(FILE *fp,const char *format[,argument,…]) { char *fp,const char *format[,address,…]) int fscanf(FILE s[80],c[80]; int a,b; 功能:按格式对文件进行I/O操作 FILE *fp; 返值:成功,返回I/O的个数;出错或文件尾,返回EOF if((fp=fopen("test","w"))==NULL) { puts("can't open file"); exit() ; } 例 fprintf(fp,“%d,%6.2f”,i,t); //将i和t按%d,%6.2f格式输出到fp文件 fscanf(stdin,"%s%d",s,&a);/*read from keaboard*/ fscanf(fp,“%d,%f”,&i,&t); //若文件中有3,4.5 ,则将3送入i, 4.5送入t fprintf(fp,"%s %d",s,a);/*write to file*/ fclose(fp); 例 从键盘按格式输入数据存到磁盘文件中去 if((fp=fopen("test","r"))==NULL) { puts("can't open file"); exit(); } Ch12_70.c fscanf(fp,"%s%d",c,&b);/*read from file*/ fprintf(stdout,"%s %d",c,b);/*print to screen*/ fclose(fp); } 14
“a/ab” (追加) if(fp==NULL) 向文本/二进制文件尾追加数据 例 FILE printf(“File open error!\n”); *fp; 标准输入------键盘 stdin 例 (读写){ *fp; 为读/写打开一个文本/二进制文件 FILE “r+/rb+”
你现在所处的位置在:首页 C语言教学 幻灯片版 第十章 文件
//文件号 //缓冲区中剩下的字符数 //文件操作方式 //文件当前读写位置 //文件缓冲区位置
5
文件类型指针
你现在所处的位置在:首页 Cfp; 用法:
文件打开时,系统自动建立文件结构体,并把指向它的指针 返回来,程序通过这个指针获得文件信息,访问文件 文件关闭后,它的文件结构体被释放 文件名 C程序 文件使用 方式 文件类型指针 操作系统
磁盘
6
你现在所处的位置在:首页 C语言教学 幻灯片版 第十章 文件