第13章 文件输入/输出


——《C Primer Plus》的搬运工,仅记录自己觉得重要的内容,方便以后参考

13.1与文件进行通信

程序与文件交互的形式就是文件重定向
文件:在磁盘或硬盘上的一段已命名的存储区
C把文件看作是一系列连续的字节,每个字节都能单独读取
两种文件模式:文本模式和二进制模式

13.1.2文本模式和二进制模式

所有文件的内容都是以二进制形式存储

  • 但是如果文件最初使用二进制编码的字符(ASCII和unicode)表示文本(如字符串),改文件就是文本文件,其中包含文本内容,文件就是文本文件,其中包含文本内容
  • 如果文件中的二进制值代表机器代码或数值数据或图片或音乐编码,文件就是二进制文件,其中包含二进制文件

两种访问文件的途径:二进制模式和文本模式

  • 二进制模式,程序可以访问文件的每个字节
  • 文本模式,程序所见的内容和文件的实际内容不同。程序以文本模式读取文件时,把本地环境表示的行末尾或文件

13.1.4标准文件

c程序会自动打开3个文件,标准输入、标准输出、标准错误输出,(键盘、显示屏)

13.2标准I/O

输入和输出都是缓冲的。就是说,一次转移一块信息而不是一个字节信息。当程序读取文件时,一块数据被拷贝到缓冲区(一块中介存储区域),这种缓冲极大的提高了数据传输速率。程序可以检查缓冲区中的字节。

13.2.1检查命令行参数

argc和argv 见11.8
exitc()函数关闭所有打开的文件并结束程序。

13.2.2fopen()函数

fopen()函数的第一个参数表示待打开文件的名称,即一个包含该文件名的字符串地址,第二个参数是一个字符串,指定待打开文件的模式

"r";//以读的方式打开
"w";//以写的方式打开,如果文件不存在,则创建一个新文件
"a";//以写的方式打开,在现有文件末尾添加内容,如果文件不存在,则创建一个新文件
"r";//以可以读写方式打开文件
"w+";//以读写方式打开文件,如果文件不存在,则创建一个新文件
"a+";//以读写方式打开文件,在现有文件的末尾添加内容,如果文件不存在,则创建一个新文件,可以读整个文件,但是只能从末尾添加内容
"rb","wb","ab",...;//以二进制模式打开文件
"x";//x模式

使用任何一种"w"模式打开一个现有文件,该文件的内容会被删除,以便程序在一个空白文件中开始模式。使用带x字母的任何一种模式,将无法打开一个现有文件——x没懂
程序成功打开文件后,fopen()将返回文件指针。文件指针的类型是指向FILE的指针,FILE是一个定义在stdio.h中的派生类型。文件指针fp并不指向实际的文件,它指向一个包含文件信息的数据对象,(可以理解FILE是一个结构),其中包含操作文件的I/O函数所用的缓冲区信息。因为标准库的中的I/O函数使用缓冲区,所以他们不仅要知道缓冲区的位置,还要知道缓冲区被填充的程度以及操作哪一个文件。标准I/O函数根据这些信息在必要时决定再次填充或清空缓冲区。fp指向的数据对象包含了这些信息

13.2.3getc()和put()函数

与getchar()和putchar()函数类似

//从标准输入中获取一个字符
ch=getchar();

//从fp指定的文件中获取一个字符
ch=getc(fp);

//把字符放入FILE指针fpout指定的文件中
putc(ch,fpout);
//第一个参数是待写入的字符,第二个参数是文件指针

//putc(ch,stout)==putchar(ch);

13.2.4文件结尾

如果getc()函数在读取一个字符时发现是文件结尾,函数返回一个特殊值EOF或NULL

int ch;
FILE* fp;
fp=("w.txt","r");
ch=getc(fp);
//while(ch!=EOF)
while((ch=getc(fp))!=EOF)
{
	putchar(ch);
}

13.2.5fclose()函数

fclose(fp);//关闭fp指定的文件,必要时刷新缓冲区

应该检查是否成功关闭文件,如果成功关闭,fclose()返回0,否则返回EOF

13.2.6指向标准文件的指针

stdio.h头文件把3个文件指针与三个标准文件相关联,程序会自动打开这个标准文件

stdin;//标准输入
stdout;//标准输出
stderr;//标准错误

13.4.1fprintf()和fscanf()函数

与printf()和scanf()函数类似,第一个参数指定待处理的文件

只有fprintf(fp,"%s\n","hello world");//加入\n
后面的追加"a"才会换行追加,否则继续写
rewind(fp);//回到文件开始处

13.4.2fgets()和fputs()函数

fgets()函数,第一个参数表示存储输入位置的地址,第二个参数是一个整数,表示待输入字符串的大小,最后一个参数是文件指针,指定待读入的文件

fgets(buf,STLEN,fp);
buf char类数组名,STLEN字符串的大小,读入STLEN-1,fp FILE类指针

fgets()函数在遇到EOF时将返回NULL
fgets()函数可能再结尾加\0

fputs()函数接受两个参数,第一个是字符串的地址,第二个是文件指针,

fputs(buf,fp);

fputs()函数不在结尾加\n

13.5随机访问fseek()和ftell()

有了fseek()函数,可以将文件看作数组,在fopen()打开的文件中直接移动到任意字节处。
fseek()函数有3个参数,返回int类型的值
ftell()函数返回一个Long类型的值,表示文件中的当前位置

——所有代码仅表示关键步骤,可能无法正常运行

发布了19 篇原创文章 · 获赞 0 · 访问量 1049

猜你喜欢

转载自blog.csdn.net/L_fengzifei/article/details/104795901