第九章读书笔记
第九章学习笔记
-
要求
本章是复习C语言中的文件操作内容,结构化从文本文件操作,二进制文件操作两个大内容考虑,以前可能只关注文本文件的操作,我们以后更多的是操作二进制文件。
文本文件中考虑字符读写,行读写,任意位置读写等
文件操作都有什么?
二进制文件和文本文件如何转换?
数据结构如何读写? -
对IO库函数的调用是普通的调用。
文件的系统调用和C语言中对文件的操作是相对应的,后者是建立在前者的基础之上的。在文件没有读完的情况下,剩余文件大小小于size(读取文件时的一次读多少),fread的返回值将会是0
-
IO库函数算法
Fread()从系统内核中向内部缓冲区转移数据,然后在向程序的缓冲区转移。
Fwrite()从程序缓冲区向内部缓冲区转移数据,接着从缓冲区向系统内核转移数据(两者都要等到缓冲区被填满后才进行下一项操作)
Fclose()写操作调用时,先关闭文件流的局部缓冲区,在进行系统调用关闭FILE结构体的文件描述符FD,最后释放文件指针。
系统调用的Read和write远比fread和fwrite更强大
-
IO库模式
-
字符模式IO
练习
-
行模式IO
-
格式化IO
-
内存中的转换函数(将ASCII数字转换成整数)
-
其他IO库函数(查一查相关函数使用说明)
rewind(fp);//将文件中的位置指针重新定位到文件开头
-
限制使用FREAD和FWRITE。
同步两个指针,使写入位置保持正确。
- 文件流缓冲
每一个文件流都是一个FILE结构体,其中包括一个内部缓冲区。
实例,在codeblocks中测试,打印过程没有区别
- 变参函数,codeblocks中没有自带的sdtarg宏变量
部分代码实现
点击查看代码
int main()
{
FILE *fp; //将小写字母转换成大写,记录行数
int c;
FILE *gp;
int line=0;
if((fp = fopen("justdance.txt","a+"))==NULL||(gp = fopen("ustdance.txt","a+"))==NULL)
{
printf("申请失败!");
exit(0);
}
else
{
while((c=getc(fp))!=EOF)//fgetc()返回的是整数
{
if(c!=10)
{
putc(c-32,gp);
}
else
{
putc(c,gp);
line++;//回车数量也就是行数
}
}
fclose(fp);
fclose(gp);
}
if((fp = fopen("justdance.txt","w"))==NULL||(gp = fopen("ustdance.txt","r"))==NULL)
{
printf("申请失败!");
exit(0);
}
else
{
while((c=getc(gp))!=EOF)//fgetc()返回的是整数
{
putc(c,fp);
}
fclose(fp);
fclose(gp);
printf("大写更改成功!一共有%d行英文",line);
}
return 0
}
点击查看代码
int main()
{
FILE *fp; //将小写字母转换成大写,记录行数
int c;
int IsWords=0,i;//用来判断是否是单词
int Wordsnum=0;
char Words[20];
if((fp = fopen("justdance.txt","r"))==NULL)
{
printf("申请失败!");
exit(0);
}
else
{
while((c=getc(fp))!=EOF)//fgetc()返回的是整数
{
if((c>=97&&c<=122)||(c<=90&&c>=65))
{
Words[IsWords] = c;
IsWords++;
}
else
{
if(IsWords>0)
{
for( i=0;i<IsWords;i++) //将单词打印出来
{
printf("%c",Words[i]);
}
printf("\n");
Wordsnum++;
IsWords=0;
}
}
Wordsnum+=1;
printf("一共有%d个单词\n",Wordsnum);
fclose(fp);
return 0;
}
}
- 感悟
应用程序想要顺利运行,离不开对文件的读取,与用户的交互也离不开输入输出,本章节主要讲述的是应用程序通过系统调用,将文件中的数据调用到程序所处的缓冲区之中为它所用。在程序员层次来看,就是通过一系列的函数,来实现文件内容的获取,以及控制获取的方式,流向等。