文件操作(基础知识c语言详解)

文章介绍了C语言中对文件进行操作的基本方法,包括使用fopen打开文件、fclose关闭文件,以及fputc、fgetc、fputs、fgets、fprintf、fscanf、fwrite和fread等函数进行顺序读写和随机读写文件。这些函数用于实现数据的持久化存储,确保数据在程序运行间得以保存。
摘要由CSDN通过智能技术生成

一.前言

为什么使用文件?

我前面学习结构体时,写了通讯录的程序,当通讯录运行起来的时候,可以给通讯录中增加、删除数据,此时数据是存放在内存中,当程序退出的时候,通讯录中的数据自然就不存在了,等下次运行通讯录程序的时候,数据又得重新录入,如果使用这样的通讯录就很难受。

我们在想既然是通讯录就应该把信息记录下来,只有我们自己选择删除数据的时候,数据才不复存在。这就涉及到了数据持久化的问题,我们一般数据持久化的方法有,把数据存放在磁盘文件、存放到数据库等方式。

使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。

二.FILE简介

FILE是一个结构体,在vs2013中FILE有如下定义:
在这里插入图片描述

三.文件函数

1.fopen打开文件

在这里插入图片描述图片来自cplusplus网站

filename 是要打开的文件名
mode 是对文件的操作
常见操作如下:
在这里插入图片描述

“r”(只读) 为了输入数据, 打开一个已经存在的文本文件 

 "w”(只写) 为了输出数据, 打开一 个文本文件 
 
 “a”(追加) 向文本文件尾港 添加数据  
 
 "rb”(只读) 为了输入数据 打开 个二进制文件 
 
 “wb”(只写) 为了输出数据, 打开 个二进制文件
 
 “ab”(追加) 向一个二进制 文件尾添加数据
 
 “r+(读写) 为了读和写,打开一个文本文件
 
 "w+"(读写) 为了读和写,建议一个新的文件
 
 “a+(读写) 打开一个文件,在文件尾进行读写
 
 “rb+(读写) 为了读和写打开一个二进制文件

 “wb+(读写) 为了读和写新建一个新的二进制文件 
 
 “ab+(读写) 打开一个二进制文件,在文件尾进行读和写

在这里插入图片描述

使用示范

FILE* pf = fopen("test.txt", "r");
	
		if (NULL == pf)
		{
			perror("fopen");
			return 1;
		}

注意"r","test.txt"必须用双引号

2.fclose关闭文件

在这里插入图片描述

int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "w");

	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

3.顺序读写文件

在这里插入图片描述

1)fputc

在这里插入图片描述
使用示范:

int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "w");

	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}

	//写文件
	int i = 0;
	for (i = 0; i < 26; i++)
	{
		fputc('a'+i, pf);
	}

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

结果展示:
在这里插入图片描述

2)fgetc

在这里插入图片描述
注意返回类型是int

使用示范:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "r");

	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
		//读文件
		int i = 0;
		for (i = 0; i < 26; i++)
		{
			int ch = fgetc(pf);
			printf("%c ", ch);
		}
	
	fclose(pf);
	pf = NULL;

	return 0;
}

结果展示:
在这里插入图片描述

3)fputs

一行一行的写入

使用示范:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "w");

	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}

	//写文件-一行一行写
	fputs("hello\n", pf);
	fputs("worl\n", pf);

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

结果展示:
在这里插入图片描述

4)fgets

一行一行的读文件
在这里插入图片描述

使用示范:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "r");

	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}

	//读文件-一行一行读
	char arr[20] = "#########";
	fgets(arr, 20, pf);//在文件pf中读取一行数据,最多读20个,存入arr中
	printf("%s", arr);
	
	fgets(arr, 20, pf);
	printf("%s", arr);


	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

结果展示:
在这里插入图片描述

5)fprint

格式化输入函数
在这里插入图片描述
使用示范:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
struct S
{
	char name[20];
	int age;
	float score;
};

int main()
{
	struct S s = { "zhangsan", 20, 95.5f };
	//把s中的数据写到文件中
	FILE*pf = fopen("test.txt", "w");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	fprintf(pf, "%s %d %.1f", s.name, s.age, s.score);//将s.name, s.age, s.score写入文件pf

	fclose(pf);
	pf = NULL;
	return 0;
}

结果展示:
在这里插入图片描述

6)fscanf

格式化输出函数
在这里插入图片描述
使用示范:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
struct S
	{
		char name[20];
		int age;
		float score;
	};
	
	int main()
	{
		struct S s = {0};
		//把s中的数据写到文件中
		FILE* pf = fopen("test.txt", "r");
		if (NULL == pf)
		{
			perror("fopen");
			return 1;
		}
		//读文件
		fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.score));//将pf文件中内容的输入s.name, (s.age), (s.score)
	
	
		printf("%s %d %f\n", s.name, s.age, s.score);
	
		fclose(pf);
		pf = NULL;
		return 0;
	}

结果展示:
在这里插入图片描述

7)fwrite

以二进制形式写入文件
在这里插入图片描述
使用示范:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
struct S
{
	char name[20];
	int age;
	float score;
};

int main()
{
	struct S s = { "zhangsan", 20, 95.5f };
	//把s中的数据写到文件中
	FILE*pf = fopen("test.txt", "wb");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//二进制的写文件
	fwrite(&s, sizeof(s), 1, pf);//将s中一个大小为sizeof(s)的内容写入文件pf

	fclose(pf);
	pf = NULL;
	return 0;
}

结果展示:
在这里插入图片描述

8)fread

二进制形式读取文件
在这里插入图片描述
使用示范:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
struct S
{
	char name[20];
	int age;
	float score;
};

int main()
{
	struct S s = {0};
	//把s中的数据写到文件中
	FILE* pf = fopen("test.txt", "rb");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//二进制的读文件
	fread(&s, sizeof(s), 1, pf);//从文件pf中读取一个大小为sizeof(s)的内容存入s

	printf("%s %d %f\n", s.name, s.age, s.score);

	fclose(pf);
	pf = NULL;
	return 0;
}

结果展示:
在这里插入图片描述

额外补充1:
在这里插入图片描述
使用示范:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int ch = fgetc(stdin);
	fputc(ch, stdout);

	return 0;
}

结果展示:
在这里插入图片描述
额外补充2:
在这里插入图片描述
额外补充3:

文件中不能包含这些字符:/:?"<>|,*

4.随机读写文件

1)fseek

在这里插入图片描述

#include <stdio.h>

int main ()
{
  FILE * pFile;
  pFile = fopen ( "example.txt" , "wb" );
  fputs ( "This is an apple." , pFile );
  fseek ( pFile , 9 , SEEK_SET );//在文件pFile中从SEEK_SET开始读取第九个内容
  fputs ( " sam" , pFile );
  fclose ( pFile );
  return 0;
}

2)ftell

在这里插入图片描述

在这里插入图片描述

#include <stdio.h>

int main ()
{
  FILE * pFile;
  long size;

  pFile = fopen ("myfile.txt","rb");
  if (pFile==NULL) perror ("Error opening file");
  else
  {
    fseek (pFile, 0, SEEK_END);   // non-portable
    size=ftell (pFile);
    fclose (pFile);
    printf ("Size of myfile.txt: %ld bytes.\n",size);
  }
  return 0;
}

3)rewind

在这里插入图片描述
在这里插入图片描述

#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;
}

欢迎斧正,如有疑惑可私信或评论,会尽力解答,大家一起加油啊!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值