栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

文件的操作方法

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

文件的操作方法

所谓文件,指的是存储在硬盘上的数据块。

文件的分类

根据读写方式:

  • 随机文件:数据读写是任意的,只要能定位到位置,就可以直接读写;
  • 顺序文件:文件的读写必须是连续的,不能跳跃。

根据数据存放格式:

  • 文本文件:将数据按单个字符存储。例如,对于整数5236,分别存储’5’,‘2’,‘3’,‘6’,共占用4字节。
  • 二进制文件:将数据转换为二进制存储。例如,对于整数5236,将十进制5236转换为二进制后是“1010001110100”,共占用2个字节。

由此可见,文本文件占用空间比二进制大,进行ASCII码也要额外耗费时间,但是利于处理单个字符。
只有数字存储会有区别,字符存储都是使用ASCII码存储,两种文件存储方式占用一样。

文件指针

文件指针是一种特殊指针,使用结构体来完成的:

FILE *a;
a=fopen("edit.txt","r");
struct _iobuf {
​​​​​​​​        char *_ptr; //文件输入的下一个位置
​​​​​​​​        int    _cnt; //当前缓冲区的相对位置
​​​​​​​​        char *_base; //文件的起始位置
​​​​​​​​        int    _flag; //flag是文件标志位
​​​​​​​​        int    _file; //file是文件的有效性
​​​​​​​​        int    _charbuf; //缓冲区检查
​​​​​​​​        int    _bufsiz; //文件大小
​​​​​​​​        char *_tmpfname; //临时文件名
​​​​​​​​        };
​​​​​​​​typedef struct _iobuf FILE;​​
文件的打开关闭操作

1)定义文件指针;
2)打开文件;
3)读写文件;
4)关闭文件。

打开文件:

FILE *fopen(const char *fname,const char *mode);

其中fname是要打开的文件名,mode指文件的打开方式

关闭文件:

int fclose(FILE *fp);

关闭成功,返回0,否则返回-1。
fclose把缓冲区的内容输出到磁盘中,释放文件指针和有关缓冲区。如果没有使用fclose关闭文件,那么可能因为缓冲区没满导致数据丢失。

案例:

#include
int main()
{
	FILE *fp;
	fp=fopen("edit.txt","r");
	if(fp==NULL)
	{
		printf("打开文件失败n");
		fp=fopen("edit.txt","wr");
		if(NULL==fp)
		{
			printf("创建文件失败n");
			return 0;
		}
		printf("打开文件成功n");
		fclose(fp);
	}
	return 0;
}
打开文件失败
打开文件成功
EOF和FEOF的区别

在C语言中,EOF是这样的:

#define EOF (-1)

EOF只能用作文本文件的结束标志,因为文本文件使用ASCII码作为结束标志,而ASCII码中不会出现-1。
EOF不仅可以判断文本文件是否结束,还能判断输入是否完成:

while((c=getchar())!=EOF)
{
	...
}

正常输入都会是正常调用,只有按下CTRL+C时会返回-1,所以EOF还可以判断输入结束。

但是在二进制文件中,不能采用EOF作为文件结束符,因为二进制文件中会出现-1。

因此,判断文件的结束,使用FEOF标志符:

#define _IOEOF             0x0010
#define feof(_stream)      ((_stream)->_flag & _IOEOF)​​

文件指针的位置是使用成员变量_ptr来标识的,当文件指针到达文末并读写时,文件的状态标识符会被置位_IOEOF。

FILE *fpin;
char c;
fpin=fopen("data.dat","rb");
while(!feof(fpin))
{
	//这个printf有说法,如果放在c=getc(fpin);下边,就会多输出一个FFFFFFFF数据,所以逻辑是先读取再判断,而不是先读取再输出再判断。
	printf("%xn",c);
	//getc的作用是读取一个字节,并前进一个指针
	c=getc(fpin);
}
文件的读写操作 读写字符
int fputc(int ch,FILE *fp);

向文件流写入一个字符,成功返回写入的字符,失败返回EOF。

int fgetc(FILE *fp);

从文件流中读取一个字符,返回读取的字节,如果到文件末尾就返回EOF。

读写字符串
int fputs(char *string,FILE *fp);

将string指向的字符串写入fp所指定的文件中。

char* fgets(char *s,int size,FILE *fp);

从文件中读取size个字符存到s中,直到出现换行符、文件尾或已读的size-1个字符为止,最后加上NULL表示字符串结束,成功返回0,失败返回非0。

读写磁盘
int fscanf(FILE *fp,char *format,[argument...]);

向fp文件指针指向的文件中写入字符,成功返回读出的个数,失败返回EOF。

int fprintf(FILE *fp,char *format[,argument]);

根据指定的格式format写入参数到fp指向的文件中,成功返回输出的字符数,失败返回负数。

读写块
size_t fwite(const void *buffer,size_t size,size_t count,FILE *fp);

将数据块写入文件。
buffer是数据地址,size是一次写入的字节数,count是写入次数,fp是文件。
成功返回写入的字节数。

size_t fread(void *buffer,size_t size,size_t count,FILE *fp);

从fp文件中读取一个数据块。
buffer是要读入的地址,size是要读取的字节数,count是要读取的个数。

块读写和字符串读写的区别是:
块读写按个数读写;
字符串读写按结束符读写。

位置指针
void rewind(FILE *fp);

将位置指针重新定位到文件开头。

int fseek(FILE *fp,long offset,int fromwhere);

fp是文件指针,offset是相对fromwhere的偏移量,fromwhere的取值如下:

long ftell(FILE *fp);

返回位置指针相对于文件首的偏移字节数。

文件的错误检查
int ferror(FILE *fp);

检查fp指向的文件是否有读写错误,没错返回0,出错返回非0.

void clearerr(FILE *fp);

恢复错误标志。

void perror(const char *s);

输出上一次错误到stderr,输出时先输出s指定的字符串。

char *strerror(int errnum);
printf("%sn",strerror(errno));
出错信息为:No such file or directory​​

将错误信息以字符串形式显示。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1033536.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号