C语言文件操作详解
数据流
- 数据流(data stream)是一组有序,有起点和终点的字节的数据序列。包括输入流和输出流。
- 程序与数据的交互是以流的形式进行的。进行C语言文件的存取时,都会先进行“打开文件”操作,这个操作就是在打开数据流,而“关闭文件”操作就是关闭数据流。
缓冲区
指在程序执行时,所提供的额外内存,可用来暂时存放做准备执行的数据。它的设置是为了提高存取效率,因为内存的存取速度比磁盘驱动器快得多。
C语言中带缓冲区的文件处理:
C语言的文件处理功能依据系统是否设置“缓冲区”分为两种:一种是设置缓冲区,另一种是不设置缓冲区。由于不设置缓冲区的文件处理方式,必须使用较低级的I/O函数(包含在头文件io.h和fcntl.h中)来直接对磁盘存取,这种方式的存取速度慢,并且由于不是C的标准函数,跨平台操作时容易出问题。下面只介绍第一种处理方式,即设置缓冲区的文件处理方式:
当使用标准I/O函数(包含在头文件stdio.h中)时,系统会自动设置缓冲区,并通过数据流来读写文件。当进行文件读取时,不会直接对磁盘进行读取,而是先打开数据流,将磁盘上的文件信息拷贝到缓冲区内,然后程序再从缓冲区中读取所需数据,如下图所示:
事实上,当写入文件时,并不会马上写入磁盘中,而是先写入缓冲区,只有在缓冲区已满或“关闭文件”时,才会将数据写入磁盘,如下图所示:
fopen、fclose
fopen
函数原型:FILE * fopen(const char * path, const char * mode)
参数path字符串包含将要打开的文件路径及文件名,参数mode字符串则代表着流形态。
文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码放在error中。
fclose
函数原型:int fclose( FILE *fp )
如果流成功关闭,fclose 返回 0,否则返回EOF(-1)
函数应用实例:
#include<stdio.h>
int main()
{
FILE *fp = NULL;
fp = fopen("text.txt","r");
if(fp == NULL)
return -1;
fclose();
fp = NULL;//需要指向空,否则会指向原打开文件地址
return 0;
}
fgetc、fputc
fgetc
函数原型:int fgetc(FILE *fp)
从文件指针fp指向的文件中读取一个字符,读取一个字节后,光标位置后移一个字节。这个函数的返回值,是返回所读取的一个字节。如果读到文件末尾或者读取出错时返回EOF。
注意到虽然是返回一个字节,但是返回值类型为int而不知unsigned char,因为EOF为-1,返回值要能够表示-1。
fputc
函数原型:int fputc (int c, FILE *fp)
c是一个整型变量,是内存要写到文件中的字符(C语言中整型量和字符量可以通用)
在正常调用情况下,函数返回写入文件的字符的ASC||码值,出错时,返回EOF。当正确写入一个字符或一个字节的数据后,文件内部写指针会自动后移一个字节的位置。
函数应用实例:将一个文件中的大写字母转为小写字母,小写字母转为大写字母后保存到另一个文件中:
#include<stdio.h>
int main()
{
char ch;
FILE *fp1,*fp2;
fp1 = fopen("a.txt","r");
if(fp1 == NULL)
return -1;
fp2 = fopen("b.txt","w");
if(fp2 == NULL)
return -1;
ch = fgetc(fp1);
while(ch != EOF)
{
if(ch >= 'a' && ch <= 'z')
ch -= 32;
else if(ch >= 'A' && ch <= 'Z')
ch += 32;
fputc(ch,fp2);
ch = fgetc(fp1);
}
fclose(fp1);
fp1 = NULL;
fclose(fp2);
fp2 = NULL;
return 0;
}
fgets、fputs
fgets
函数原型:char *fgets(char *str,int n,FILE *fp)
从由fp指出的文件中读取n-1个字符(因为第n个是’\0’),并把它们存放到由str指出的字符串数组中去,最后加上一个字符串结束符’\0’。如果文件中的该行不足n个字符,则读完该行就结束。若该行(包括最后一个换行符)的字符数超过n-1,则只返回一个不完整的行,但是,缓冲区总是以NULL字符结尾,对fgets的下一次调用会继续该行。函数成功将返回指向str的指针,失败或读到文件结尾返回NULL,因此不能直接通过fgets的返回值来判断函数是否是出错而终止的,应该借助feof函数或ferror函数来判断。
- str:接收字符串的内存地址,可以是数组名,也可以是指针。
- n:指出要读取字符串的个数。
- fp:这是个文件指针,指出要读取的文件。
fputs
函数原型:int fputs(char *str,FILE *fp)
- str是字符型指针,可以是字符串常量,或者存放字符串的数组首地址。
- fp是文件指针。
向fp指向的文件写入一个字符串(不自动写入字符串结束标记符’\0’)。成功写入一个字符串后,文件的位置指针会自动后移,函数返回值为非负整数,否则返回EOF。
函数应用实例:将一个文件中的内容复制到另一个文件
#include<stdio.h>
int main(int argc,char **argv)
{
FILE *fp1,*fp2;
char str[256];
fp1 = fopen("a.txt","r");//a.txt中的内容是ABCabc123
fp2 = fopen("b.txt","w");//b.txt为空
if(fp1 == NULL)
return -1;
if(fp2 == NULL)
return -1;
if(fgets(str,4,fp1) == NULL)//这里调用fgets一次,读取出3个字符
printf("失败");
else
fputs(str,fp2);
if(fgets(str,7,fp1) == NULL)//这里第二次调用fgets,读取出剩下的6个字符
printf("失败");
else
fputs(str,fp2);
if(fgets(str,2,fp1) == NULL)//由于文件已经读取完毕,因此返回NULL
printf("失败");
else
fputs(str,fp2);
return 0;
}
来源:CSDN
作者:!一直往南方开.
链接:https://blog.csdn.net/qq_44205272/article/details/103677979