C语言文件的基础操作
Posted Billy Miracle
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言文件的基础操作相关的知识,希望对你有一定的参考价值。
文件
“文件”是指存放在外部存储介质(可以是磁盘、光盘、磁带等)上的数据集合。
ASCII文件和二进制文件
ASCII文件(又称文本文件)便于对字符进行逐个处理,也便于输出字符。但一般占存储空间较多,而且要花费转换时间。
二进制文件可以节省外存空间和转换时间,但一个字节并不对应一个字符,不能直接输出字符形式。
在C语言中,标准输入设备(键盘)和标准输出设备(显示器)是作为ASCII码文件处理的,它们分别称为标准输入文件和标准输出文件。
文件类型的指针
在C语言中有一个特殊的指针,这个指针是已经帮我定义好了的,在stdio的头文件中,定义了一个FILE的文件指针。
FILE指针的声明:
FILE * fp;
这是一个文件指针。变量名为 fp,类型为 FILE。文件指针指向一个结构。
标准输入/输出函数
fopen函数
fopen的函数原型:
FILE *fopen(char *filename, char *mode);
功能:使用mode模式打开指定的filename文件。如果打开成功,则返回一个FILE类型的指针;打开文件失败,则返回NULL。
使用文件的方式 | 指令的作用 |
---|---|
“r” | (只读)为输入,打开一个文本文件 |
“w” | (只写)为输出,打开一个文本文件 |
“a” | (追加)向文本,文件尾增加数据 |
“rb” | (只读)为输入,打开一个二进制文件 |
“wb” | (只写)为输出,打开一个二进制文件 |
“ab” | (追加)向二进制文件尾增加数据 |
"r+“ | (读写)为读/写打开一个文本文件 |
"w+” | (读写)为读/写建立一个新的文本文件 |
"w+” | (读写)为读/写建立一个新的文本文件 |
“a+” | (读写)为读/写打开一个文本文件(追加) |
"rb+” | (读写)为读/写打开一个二进制文件 |
“wb+” | (读写)为读/写建立一个新的二进制文件 |
“ab+” | (读写)为读/写打开一个二进制文件 |
含义:
- r(read):写
- w(write):读
- a(append):追加
- t(text):文本文件,可省略
- b(binary):二进制
fclose函数
函数调用:
fclose(文件指针);
函数功能:
使文件指针变量不指向该文件,也就是文件指针变量与文件“脱钩”,此后不能再通过该指针对原来与其相联系的文件进行读写操作
返回值:
关闭成功返回值为0;否则返回EOF(-1)
fwrite函数
函数原型:
size_t fwrite(const void *buffer,size_t bytes, sizeo_t n,FILE *fp);
函数参数:
- buffer:要写入数据的首地址
- bytes:每份数据的大小
- n:要写入几份数据
- fp:要输入的文件指针。
函数返回值:成功时返回写入的单元数,否则返回0
函数功能:fwrite是无格式写函数,用于向文件写入整块的数据。
例如我们把一个用户结构体的数据写入文件
USER user={1001, “admin”, ”123456”}
int pf=0;
pf = fwrite(&user, sizeof(USER), 1, fp);
//fp是已经打开的文件
if(pf==0) {
printf(“写入成功!\\n”);
} else {
printf(“写入失败!\\n”);
}
//这里有一个要注意的地方就是,我们写入成功后,其实这个数据还并没有真正写入到文件
//里面,而是先存在了缓存区,所以我们要刷新一下缓存区使用fflush函数
fflush(pf);
fread函数
函数原型:
size_t fread(void *buffer, size_t bytes, sizeo_t n, FILE *fp);
函数参数:
- buffer:接收数据的首地址
- bytes:每份数据的大小
- n:要接收几份数据
- fp:要操作的文件指针。
函数名返回值:成功时返回读出的单元数,否则返回0
函数功能:fread是无格式读函数,用于向文件读出整块的数据。
例如我们把刚刚的用户读取出来
pf = fread (&user, sizeof(USER), 1, fp);
//fp是已经打开的文件
if(pf==0) {
printf(“读取失败!\\n”);
} else {
printf(“读取成功!\\n”);
}
我们使用读取函数的时候要注意光标的位置,如果光标的位置在末尾那么久读取不到东西,所以为了我们能够读取到数据我们需要一个可以定位光标的函数,下面就有介绍。
rewind函数
函数原型:
void rewind(FILE * fp) ;
函数参数:
- fp:要操作的文件指针
函数返回值:无
函数功能:将文件的光标定位到文件的头部
例子:
rewind(pf);
fseek函数
函数原型:
int fseek (FILE *fp, long int offset, int origin);
函数参数:
- fp:要操作的文件指针
- offset:偏移量
- origin:搜索起始位置
函数返回值:无
函数功能:通过指定相对于开始位置、当前位置或流的末尾位置的偏移量来定位光标位置。
这个函数的第三个参数,只有三个变量,这三个变量是库里面有对应的宏定义,SEEK_SET 或 0(文件开始),SEEK_CUR 或 1(当前文件指针位置),SEEK_END 或 2(文件末尾)。这个偏移量是可正可负的(正向后偏移,负向前偏移),一般如果在文件头那么这个偏移量为正,在尾部则为负,中间就随便了。
ftell函数
函数原型:
long int ftell(FILE *pf);
函数参数:
- pf:要操作的文件
函数返回值:返回字节数
函数功能:获取当前文件指针离文件开头的字节数
例子:
long int nLength=0;
fseek(fp, sizeof(USER),SEEK_END);//偏移到文件尾部
nLength = ftell(fp);//获取当前文件指针离文件开头的字节数
printf(“the file length is %d\\n”, nLength);
以上是关于C语言文件的基础操作的主要内容,如果未能解决你的问题,请参考以下文章