Linux应用开发——文件操作(c标准库)
本说明介绍C标准库提供的常用文件操作函数:fopen、fread函数、fwrite函数、fclose函数、fflush函数、fseek函数。
1. fopen函数
函数原型:
#include <stdio.h>
FILE *fopen(const char *pathname, const char *mode);
用法:
用于打开或者创建文件,并且返回相应的文件流。
参数说明:
-
pathname:用于指定要打开或创建的文件名
-
mode:用于文件的打开方式,该参数是字符串,输入时需要带双引号,如“r”。
-
“r”:以只读的方式打开,指针于文件的开头。
-
“r+”:以读和写的方式打开,指针于文件开头。
-
“w”:以写方式打开,并清空文件内容,指针于文件开头。
-
“w+”:内容同上,当文件不存在时,“w”模式会返回错误,而“w+”会创建新文件。
-
“a”:以追加的方式打开文件,指针于文件末尾。
-
“a+”:以读和写的方式打开,其他同上。
-
fopen:的返回值是FILE类型的文件流,当它的值不为NULL时表示正常。
2. fread函数
函数原型:
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
用法:
用于从文件流中读取数据。返回值为成功读取的项数(项的单位为size)
参数说明:
-
stream:是使用fopen打开的文件流
-
nmemb:表示有多少项数据。
-
size:项目的大小。
3. fwrite函数
函数原型:
#include <stdio.h>
size_t fwrite(void *ptr, size_t size, size_t nmemb, FILE *stream);
用法:
用于把数据写入文件流中。返回值为成功写入的项数(项的单位为size)
参数说明:
- stream:是使用fwrite打开的文件流
- nmemb:表示有多少项数据。
- size:项目的大小。
4. fclose函数
函数原型:
#include <unistd.h>
int close(int fd);
用法:
用于关闭指定的文件流,因为标准库会对数据进行缓冲,关闭时它会把未写到文件的内容都写出。
5. fseek函数
函数原型:
#include <stdio.h>
int fseek(FILE *stream, long offset, int whence);
用法:
用于设置下一次读写函数操作的位置。
参数说明:
offset参数用于指定位置,whence参数定义了offset的意义,whence的可取值如下:
-
SEEK_SET:offset是一个绝对位置。
-
SEEK_END:offset是以文件尾为参考点的相对位置。
-
SEEK_CUR:offset是以当前位置为参考点的相对位置。
6. fflush函数
函数原型:
#include <stdio.h>
int fflush(FILE *stream);
用法:
用于把尚未写到文件的内容立即写出。常用于确保前面的操作的数据被写入到磁盘上。fclose函数本身也包含了fllush的操作。
7.实验代码分析
#include <stdio.h>
#include <string.h>
//要写入的字符串
const char buf[] = "filesystem_test:Hello World!\n";
//文件描述符
FILE *fp;
char str[100];
int main(void)
{
//创建一个文件
fp = fopen("filesystem_test.txt", "w+");
//正常返回文件指针
//异常返回NULL
if(NULL == fp){
printf("Fail to Open File\n");
return 0;
}
//将buf的内容写入文件
//每次写入1个字节,总长度由strlen给出
fwrite(buf, 1, strlen(buf), fp);
//写入Embedfire
//每次写入1个字节,总长度由strlen给出
fwrite("Embedfire\n", 1, strlen("Embedfire\n"),fp);
//把缓冲区的数据立即写入文件
fflush(fp);
//此时的文件位置指针位于文件的结尾处,使用fseek函数使文件指针回到文件头
fseek(fp, 0, SEEK_SET);
//从文件中读取内容到str中
//每次读取100个字节,读取1次
fread(str, 100, 1, fp);
printf("File content:\n%s \n", str);
fclose(fp);
return 0;
}