文件的操作

什么是文件

磁盘上的文件是文件。

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

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

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

例如: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;
 }
相关推荐
*.✧屠苏隐遥(ノ◕ヮ◕)ノ*.✧6 小时前
C++学习:基础知识的掌握
c++·visualstudio
江畔柳前堤7 小时前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
Doraemomo7 小时前
数据结构-环形链表
java·数据结构·链表
Forever Nore8 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
罗西的思考9 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX10 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
爱跳舞的烤冷面11 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号11 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
月光船幽幽11 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI11 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研