【Linux篇】标准C库对文件操作

一.open、fopen区别

a、来源:
(1)open是UNIX系统调用函数(包括LINUX等),返回的是文件描述符,他是文件在文件描述符表里的索引。
(2)fopen是ANSIC标准中的C语言库函数,在不同的系统中应该调用不同的内核API,返回的是一个指向文件结构的指针。
b、移植性:
fopen是C标准函数,因此拥有良好的移植性,只要是C语言写的就行;而‘open’是UNIX系统调用,移植性有限,open不能在Windows下运行。
c、适用范围:
(1)Open返回文件描述符,在一些特定的环境下必须要用Open,如网络套接字,硬件设备等。包括操作普通正规文件(Regular File)。
(2)fopen是用来操作普通正规文件(Regular File)的。
d、文件IO层次:open低级IO、 fopen 高级IO
e、缓冲:

缓冲文件系统:fopen是在缓冲区中进行文件操作的。

非缓冲文件系统:open是通过系统调用,在内核中进行文件操作的。

二.标准C库常用API

1.fopen

FILE * fopen(constchar *path , cost char *mode)

/*
* @description : 打开一个文件
* @param ‐ path : 指定文件路径,如:"./test.txt"
* @param ‐ mode :指定文件的打开方式
* @return : 成功,返回指向该文件的文件指针; 若失败,返回 NULL
*/
mode:
r:只读方式打开,文件必须存在
r+:可读写,文件必须存在
rb+:打开二进制文件,可以读写
rt+:打开文本文件,可读写
w:只写,文件存在则文件长度清0,文件不存在则建立该文件
w+:可读写,文件存在则文件长度清0,文件不存在则建立该文件
a:附加方式打开只写,不存在建立该文件,存在写入的数据加到文件尾,EOF符保留
a+:附加方式打开可读写,不存在建立该文件,存在写入的数据加到文件尾,EOF符不保留
wb:打开二进制文件,只写 wb+:打开或建立二进制文件,可读写
wt+:打开或建立文本文件,可读写
at+:打开文本文件,可读写,写的数据加在文本末尾 ab+:打开二进制文件,可读写,写的数据加在文件末尾

 2.fwrite

int fwrite(void*buffer,intsize,intcount,FILE*fp)

/*
* @description :对已打开的流进行写入数据块
* @param ‐ ptr :指向 数据块的指针
* @param ‐ size :指定写入的每个数据项的字节数,如调用sizeof(char)
* @param ‐ nmemb :指定写入的数据项的个数
* @param ‐ stream :要写入的文件流
* @return : 返回实际写入的数据项的个数
*/

3.fread

size_t fread(void*buff , size_t size, size_t count , FILE* stream)

/*参数:
第一个参数为接收数据的指针(buff),也即数据存储的地址
第二个参数为单个元素的大小,即由指针写入地址的数据大小,注意单位是字节
第三个参数为元素个数,即要读取的数据大小为size的元素个素
第四个参数为提供数据的文件指针,该指针指向文件内部数据
返回值:读取的总数据元素个数
*/

 4.fseek

int fseek(FILE *stream,long offset,int framewhere)

/*参数:
第一个为文件指针,第二个是指针的偏移量,第三个是指针偏移起始位置
返回值:重定位成功返回0,否则返回非零值
*/

编程示例:

#include <stdio.h>
#include <string.h>

int main()
{
	FILE *fp;
	char *str = "hello world";
	char readBuf[128] = {0};

	fp = fopen("./gao.txt","w+");
	fwrite(str,sizeof(char)*strlen(str),1,fp);	
	fseek(fp,0,SEEK_SET);
	fread(readBuf,sizeof(char)*strlen(str),1,fp);	
	printf("read data:%s\n",readBuf);
	fclose(fp);

	return 0;
}

5.fputc 

int fputc(int c, FILE *fp)

功能:写一个字符到文件中
参数:第一个参数为要写的字符,第二个参数为文件流
返回值:成功则返回输入的字符,出错返回EOF。

编程示例:

#include <stdio.h>
#include <string.h>

int main()
{
	FILE *fp;
	int i;
	char *str = "hello world";
	int len = strlen(str);

	fp = fopen("./test.txt","w+");
	for(i=0;i<len;i++){
		fputc(*str,fp);
		str++;	
	}
	return 0;
}

 

 6.fgetc

int fgetc(FILE *fp)

功能:从文件中读取一个字符;
参数:文件流
返回值:正确为读取的字符,到文件结尾或出错时返回EOF。

7.feof

int feof(FILE *stream);

功能:判断是否已经到文件结束
参数:文件流
返回值:到文件结束,返回为非0,没有则返回0

编程示例:

#include <stdio.h>

int main()
{
	FILE *fp;
	char c;
	fp = fopen("./test.txt","r");

	while(!feof(fp)){
		c = fgetc(fp);
		printf("%c",c);		
	}
	fclose(fp);

	return 0;
}

三.标准C库写入结构体到文件

#include <stdio.h>

struct Test
{
	int a;
	char c;
};

int main()
{
	FILE *fp;
	struct Test data = {100,'a'};
	struct Test data2;

	fp = fopen("./file1","w+");
	int n_write = fwrite(&data,sizeof(struct Test),1,fp);
	fseek(fp,0,SEEK_SET);
	int n_read = fread(&data2,sizeof(struct Test),1,fp);
	printf("fread %d,%c\n",data2.a,data2.c);
	
	fclose(fp);

	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿gao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值