c primer学习笔记文档格式.docx
- 文档编号:17707667
- 上传时间:2022-12-08
- 格式:DOCX
- 页数:24
- 大小:31.70KB
c primer学习笔记文档格式.docx
《c primer学习笔记文档格式.docx》由会员分享,可在线阅读,更多相关《c primer学习笔记文档格式.docx(24页珍藏版)》请在冰豆网上搜索。
如果不能打开文件则返回一个空指针NULL。
13.2.3getc()函数和putc()函数
getc()ch=getc(fp)表示从fp指定的文件中获得一个字符;
putc(参数1,参数2)
putc(ch,fpout)表示将字符ch写入到FILE指针fpout指定的文件中
13.2.42文件结尾
从文件中读取数据的程序需要在到大文件的结尾时停止。
到达文件结尾时,getc()函数会返回一个特殊值EOF
13.2.5fclose()函数
Fclose(fp)关闭由指针fp指定的文件,同时根据需要刷新缓冲区。
13.2.6标准文件指针
包含3个标准文件指针:
stdin(标准输入)、stdout(标准输出)、stderr(标准错误)
13.3一个简单的文件压缩程序
13.4文件I/O
每个I/O函数都存在一个相似的文件I/O函数。
文件I/O函数需要使用一个FILE指针来为这些函数指定要操作的文件。
13.4.1fprintf()和fscanf()函数
fprintf()和fscanf()
✧fprintf/fscanf(参数1,参数2,参数3)
参数1为FILE指针;
例如fprintf(fp,“%s”,words)其中fp是FILE指针,words是数组名称;
rewind(参数1)使程序回到文件开始处,参数1必须是一个文件指针;
13.4.2fgets()和fputs()函数
fgets(参数1,参数2,参数3)fgets(buf,max,fp)
一个地址,用于存储输入值的地址
一个整数,输入字符串的最大长度
✧参数3:
一个文件指针,这个指针指向要读取的文件
✧返回值:
返回传递给它的地址值,当遇到EOF时,返回NULL
«
fgets()函数读取到它遇到的第1个换行字符的后面,或者读取比字符串的最大长度少一个的字符,或者读取到文件结尾。
然后fgets()向末尾添加一个空字符以构成一个字符串。
如果fgets在达到字符最大数目之前读完一整行,它将在字符串的空字符前添加一个换行符以表示一行结束。
Fputs(参数1,参数2)
把字符串地址指针所指的字符串写入指定的文件。
(与fgets相比,没有写入的长度,因为字符串包含结束符)
一个地址,是要写入到文件的字符串的地址
一个文件指针,指向要写入字符串的文件
fgets保留了换行符,fputs不会添加换行符;
13.5随机存取
13.5.1fseek()和ftell()文件的定位函数
fseek(参数1,参数2,参数3)
一个文件指针,指向被搜索的文件
一个long类型的值。
表示从起始点开始的偏移量(偏移的字节数),正表示前移,负表示后移,0表示保持不动
模式,决定偏移量的起始点,一般分为SEEK_SET、SEEK_CUR、SEEK_END
正常则返回0,不正常则返回-1
ftell(参数1)ftell函数为long型函数,返回文件的当前位置(1个long型数据)。
通过返回距离文件起始处的字节数目来确定文件的位置。
13.5.4fgetpos()和fsetpos()
处理较大文件的定位函数。
13.6标准I/O内幕
执行一次fopen函数:
✧打开一个文件
✧建立一个(读写模式下两个)缓冲区
✧创建一个数据结构(包含文件和缓冲区相关数据),包括以下内容
•错误指示器
•文件结尾指示器
•指向缓冲区起始处的指针
•文件标示符
•计数器:
记录实际复制到缓冲区中的字节数
✧返回一个指向该结构的指针
13.7其他标准I/O函数
13.7.4二进制I/O:
fread()和fwrite()
数据用二进制形式存入文件,没有数字形式到字符形式的转换。
存入的数据更精确。
13.8知识总结
比较常用的共12个
1)fopen(参数1,参数2)文件地址,模式
2)fclose(参数1)文件指针
3)getc(参数1)文件指针
4)putc(参数1,参数2)写入文件的字符,文件指针
5)fgets(参数1,参数2,参数3)存入字符串的地址,字符长度,文件指针
6)fputs(参数1)文件指针
7)fprintf(参数1,参数2,参数3)文件指针,输出格式,字符串地址
8)fscanf(参数1,参数2,参数3)文件指针,输入格式,字符串地址
9)fseek(参数1,参数2,参数3)文件指针,偏移量,起始点模式
10)ftell(参数1)文件指针
11)fread(参数1,参数2,参数3)
12)fwrite(参数1,参数2,参数3)
第14章结构和其他数据格式
14.1实例问题:
创建图书目录
P379
14.2建立结构声明
Structbook
{
chartitle[41];
charauthor[31];
floatvalue;
};
structbooklibrary;
把library定义为一个book结构设计的结构变量;
其中struct是关键字,表示接下来是一个结构;
Book:
是一个可选的标记
花括号内是结构成员列表;
14.3定义结构变量
结构有两个意思:
一是结构设计,一是结构变量
✧结构设计:
告诉编译器如何表示数据,但并没让计算机为数据分配空间
✧结构变量:
编译器使用book模板为该变量分配空间;
声明结构和定义结构变量的过程可以合并,如下:
Struct
}library;
但是如果要多次使用一个结构模板,就必须使用标记;
14.3.1初始化结构
使用一个用花括号括起来、逗号分隔的初始化项目列表进行初始化。
如下
Structbooklibrary
“CPrimer”,
“StephenPrata”,
60.00
14.3.2访问结构成员
访问结构的成员:
用结构成员运算符点(.)例
gets(library.title)
14.3.3结构的指定初始化项目
指定初始化:
用点运算符和成员名来表示具体的元素;
例:
structbookgift={.value=25.99,
.author=“JamesBroadfool”,
.title=“RuefortheToad”};
1)可以按任何顺序指定初始化
2)只初始化某个成员
3)对特定的成员,最后一次赋值是它实际的值
14.4结构数组
14.4.1声明结构数组
Structbooklibrary[10];
Library本身不是结构名,它是元素类型为structbook结构的数组名。
14.4.2表示结构数组的成员
library[1].value
library[2].title[5]第2个结构的title成员的第6个字符
14.5嵌套结构
结构的某一个或多个成员也是结构。
访问嵌套结构的成员的方法:
应用两次点运算符。
#include<
stdio.h>
#defineLEN20
constchar*msg[5]=//定义字符常量数组
"
Thankyouforthewonderfulevening,"
Youcertainlyprovethata"
isaspecailkindofguy.Wemustgettogether"
overadelicious"
andhaveafewlaughs"
structnames
charfirst[LEN];
charlast[LEN];
structguy
structnameshandle;
charfavfood[LEN];
charjob[LEN];
floatincome;
intmain(void)
structguyfellow={//初始化结构
{"
Even"
"
Villard"
},
"
grilledsalmon"
personalitycoach"
58112.00
};
printf("
Dear%s,\n\n"
fellow.handle.first);
%s%s\n"
msg[0],fellow.handle.first);
//访问嵌套结构的成员
msg[1],fellow.job);
%s\n"
msg[2]);
%s%s%s\n"
msg[3],fellow.favfood,msg[4]);
\n%40s%s\n"
"
"
Seeyousoon,"
);
%40s%s\n"
Shalala"
return0;
}
14.6指向结构的指针
14.6.1声明和初始化结构指针
声明:
structguy*him;
意味着指针him现在可以指向任何现有的guy类型的结构。
初始化:
him=&
fellow[0];
14.6.2使用指针访问成员
初始化后的him,有两种方式访问指针成员
✧him->
income;
✧(*him).income二者完全相同
14.7向函数传递结构信息
函数与结构的传递包括3种方式:
传递结构成员、传递结构地址、传递结构;
14.7.1向函数传递结构成员
14.7.2向函数传递结构地址
#defineFUNLEN50
structfunds
charbank[FUNLEN];
doublebankfund;
charsave[FUNLEN];
doublesavefund;
doublesum(conststructfunds*);
//声明函数,其中参数为指向结构的指针
intmain(void)
structfundsstan={
Garlic-MelonBank"
3024.72,
Lucky'
sSavingsandLoan"
9237.11
Stanhasatotalof$%.2f.\n"
sum(&
stan));
//结构的地址必须用&
doublesum(conststructfunds*money)
return(money->
bankfund+money->
savefund);
//通过指针直接访问原结构stan
14.7.3向函数传递结构
doublesum(structfundsmoolah);
//声明函数,参数为结构
sum(stan));
//将结构传递给函数
doublesum(structfundsmoolah)
return(moolah.bankfund+moolah.savefund);
//会创建一个和stan一样的结构
14.7.4结构的一些特性
1)结构的成员、结构的地址、结构可作为函数的参数向函数传递信息
2)赋值:
两个结构类型相同,可将一个结构赋值给另外一个结构
3)把一个结构(已经初始化的)初始化另外一个结构
4)结构可以作为函数的返回值
结构指针作为参数的例子:
//要求输入名和姓,然后得到姓名中的字母总数
string.h>
structnamect{
charfname[20];
charlname[20];
intletters;
voidgetinfo(structnamect*);
voidmakeinfo(structnamect*);
voidshowinfo(conststructnamect*);
structnamectperson;
getinfo(&
person);
//传递的是结构的地址
makeinfo(&
showinfo(&
voidgetinfo(structnamect*pst)
Pleaseenteryourfirstname.\n"
gets(pst->
fname);
//实际操作的还是那一个结构
Pleaseenteryourlastname.\n"
gets(pst->
lname);
voidmakeinfo(structnamect*pst)
pst->
letters=strlen(pst->
fname)+strlen(pst->
voidshowinfo(conststructnamect*pst)
%s%s,yournamecontains%dletters.\n"
pst->
fname,pst->
lname,pst->
letters);
结构作为参数的例子:
structnamectgetinfo(void);
//函数返回类型为struct
structnamectmakeinfo(structnamect);
voidshowinfo(structnamect);
person=getinfo();
person=makeinfo(person);
//传递的参数为结构
showinfo(person);
structnamectgetinfo(void)
structnamecttemp;
//创建一个新的结构
gets(temp.fname);
gets(temp.lname);
returntemp;
structnamectmakeinfo(structnamectinfo)//创建一个新的结构
info.letters=strlen(info.fname)+strlen(info.lname);
returninfo;
voidshowinfo(structnamectinfo)///创建一个新的结构
info.fname,info.lname,info.letters);
14.7.5结构,还是指向结构的指针
1)为提高效率,使用结构指针作为函数参数,当要保护数据、防止意外改变数据时对指针使用const限定词
2)处理小型结构时常用传递结构值的方法;
14.8把结构内容保存到文件中
14.9结构:
下一步是什么
14.10联合介绍
定义:
一个能在同一个存储空间里(但不同时)存储不同类型的数据类型。
联合的定义:
联合模板、联合变量、联合标记
Unionhold
intdigit;
doublebigfl;
charletter;
unionholdfit;
//其中hold为联合标记,fit为联合变量,方括弧为联合模板;
联合的初始化:
1)初始化为同样的另外一个联合
2)初始化联合的第1个元素
3)指定初始化项目
14.11枚举类型
枚举是一种代表整数常量的符号名称;
注:
enum常量是int类型的,因此在使用int类型的任何地方都可以使用它。
枚举类型的目的是提高程序的可读性。
默认情况下,枚举列表中的常量被指定为整数值0、1、2等等。
可以指定常量具有的值。
例如:
enumlevels{low=100,medium=500,high=2000};
如果只对某一个常量赋值,而没有对后面的常量赋值,那么这些后面的常量会被赋予后续的值。
enumfeline{cat,lynx=10,puma,tiger};
则对应值的一次为0,10,11,12。
14.12typedef简介
typedef工具是一种高级数据特性,能为某一类型创建自己定义的名字。
Typrdef与#define的区别:
1)typedef给出的符号名称仅限于对类型,而不是对值;
2)typedef的解释由编译器,而不是预处理器执行
3)typedef比#define更灵活
使用方法:
typedefunsignedcharBYTE;
随后就可以用BYTE来定义变量了。
即typedefbA其中b为类型,A为字符名称
用typedef来命名一个结构类型时,可以省去结构的标记。
注意:
typedef并不是创建新的类型,只是创建了便于使用的标签。
14.13奇特的声明
C语言中,当进行一个声明时,可以添加修饰符来修饰名称或标示符。
一共包含3个修饰符:
*、()、[]
这3个修饰符的使用规则:
1)优先级:
()、[]优先级一样,高于*
2)()、[]顺序从左向右组合
14.14函数和指针
指向函数的指针:
保存着指向函数代码起始处的地址
声明一个函数指针时,必须声明它指向的函数类型(包括函数返回类型、函数的参量类型)。
viod(*pf)(char*)//pf是一个指向函数的指针,(*pf)为一个函数,(char*)为该函数的参量列表,void作为其返回类型。
函数名可以用来表示函数的地址。
第16章C预处理器和C库
C预处理器:
因为在编译程序之前,先由预处理器检查程序
16.1翻译程序的第一步
1)首先将源代码中出现的字符映射到源字符集;
2)第二,将两个物理行转换成一个逻辑行;
3)其次,编译器将文本划分成预处理的语言符号序列、空白字符及注释序列。
16.2明显常量:
#define
每个#define行由3部分组成:
#definePXprintf(“xis%d.\n”,x);
第1部分第2部分第3部分
第1部分:
#define本身
第2部分:
缩略语,称为宏
第3部分:
类对象宏(主体)
宏展开:
预处理器在程序中发现了宏的实例后,总会用实体代替该宏,从宏变成最终的替换文本的过程称为宏展开;
预处理器不进行计算,只是按照指令进行文字替换操作。
但是在双引号中的宏却不会进行替换,例
#defineTWO2
#defineOW“ABC”
Printf(“TWO:
OW”);
则打印的结果是TWO:
OW
16.2.1语言符号
16.2.2重定义常量
假设将LIMIT定义为20,后来在该文件中又把LIMIT定义为25,这个过程被称为重定义常量
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- primer学习笔记 primer 学习 笔记