文件的操作

什么是文件

磁盘上的文件是文件。

在程序设计中,我们一般谈的文件有两种:程序文件,数据文件。

文件名 :文件的唯一标识:以便用户识别和引用。

包含三部分:文件路径+文件名主干+文件后缀

例如:c:\code\test.txt
文件类型

根据数据的组织形式,数据文件被称为文本文件和二进制文件。

数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。

如果要求在外存上以ASCII码形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件

一个数据在内存中怎样存储?

字符一律以ASCII码的形式存储,数值型既可用ASCII形式存储,也可用二进制形式存储。

如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节(VS2013测试)。

c 复制代码
int main()
{
	int a = 10000;
	FILE* pf = fopen("test.txt", "wb");
	fwrite(&a, 4, 1, pf);//二进制的形式写到文件中。
	fclose(pf);
	pf = NULL;
	return 0;
}

文件缓冲区

ANSIC标准采用"缓冲文件系统"处理数据文件,所谓缓冲文件系统是指系统自动地在内存中为程序中每个正在使用的文件开辟一块"文件缓冲区"。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区,缓冲区的大小根据c编译系统决定。

文件指针

每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名FILE.

文件的打开和关闭

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。
在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。

复制代码
FILE* fopen(const char* filename,const char* mode);
int fclose(FILE* stream);
c 复制代码
 /* fopen fclose example */
 #include <stdio.h>
 int main ()
 {
  FILE * pFile;
  pFile = fopen ("myfile.txt","w");
  if (pFile!=NULL)
  {
    fputs ("fopen example",pFile);
    fclose (pFile);
  }
  return 0;
 }

文件的随机读写

fseek

复制代码
int fseek(FILE* stream,long int offset,int origin);
c 复制代码
 /* fseek example */
 #include <stdio.h>
 int main ()
 {
  FILE * pFile;
  pFile = fopen ( "example.txt" , "wb" );
  fputs ( "This is an apple." , pFile );
  fseek ( pFile , 9 , SEEK_SET );
  fputs ( " sam" , pFile );
  fclose ( pFile );
  return 0;
 }


ftell

复制代码
long int ftell(FILE* stream);

返回文件指针相对于起始位置的偏移量。

c 复制代码
int main()
{
	FILE* pFile;
	long size;
	pFile = fopen("myfile.txt", "rb");
	if (pFile == NULL) perror("Error opening file");
	else
	{
		fseek(pFile, 0, SEEK_END);
		size = ftell(pFile);
		fclose(pFile);
		printf("Size of myfile.txt: %ld bytes.\n", size);
	}
	return 0;
}

rewind

让文件指针的位置回到文件的起始位置。

复制代码
void rewind(FILE* stream);
c 复制代码
 #include <stdio.h>
 int main ()
 {
 int n;
 FILE * pFile;
 char buffer [27];
 pFile = fopen ("myfile.txt","w+");
 for ( n='A' ; n<='Z' ; n++)
 fputc ( n, pFile);
 rewind (pFile);
 fread (buffer,1,26,pFile);
 fclose (pFile);
 buffer[26]='\0';
 puts (buffer);
 return 0;
 }
相关推荐
渡我白衣43 分钟前
字符串的陷阱与艺术——std::string全解析
网络·c++·人工智能·自然语言处理·智能路由器·信息与通信·caffe
吃不饱的得可可1 小时前
C++17常用新特性
开发语言·c++
_OP_CHEN1 小时前
算法基础篇:(七)基础算法之二分算法 —— 从 “猜数字” 到 “解难题” 的高效思维
c++·算法·蓝桥杯·二分查找·acm·二分答案·二分算法
一匹电信狗1 小时前
【C++11】Lambda表达式+新的类功能
服务器·c++·算法·leetcode·小程序·stl·visual studio
在等晚安么1 小时前
力扣面试150题打卡
算法·leetcode·面试
煤球王子1 小时前
学而时习之:C++中的枚举
c++
AI科技星1 小时前
宇宙膨胀速度的光速极限:基于张祥前统一场论的第一性原理推导与观测验证
数据结构·人工智能·经验分享·python·算法·计算机视觉
楼田莉子1 小时前
C++/Linux小项目:自主shell命令解释器
linux·服务器·开发语言·c++·后端·学习
EXtreme352 小时前
C语言指针深度剖析(2):从“数组名陷阱”到“二级指针操控”的进阶指南
c语言·开发语言·算法
luoganttcc2 小时前
介绍一下 机器人坐标转换的 RT 矩阵
算法