c语言文件操作

本文详细介绍了C语言中常见的文件操作函数,包括fprintf用于文件写入,fscanf用于文件读取,fgets的功能以及如何利用fread和fwrite进行文件拷贝。此外,还提到了fseek、ftell和rewind等用于文件位置移动的函数,以及文件状态的获取、文件的删除和重命名。文章通过实例代码展示了这些函数的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.c语言文件操作

​ c语言操作文件有很多函数,并且每个文件操作函数都需要文件指针FIFE实现

1.fprintf

​ 函数原型 int fprintf(FILE * stream, const char * format, …);

​ fprintf函数和printf函数用法差不多不过就是第一个参数是个文件指针,具体例子代码如下

#include<stdio.h>
#pragma warning(disable:4996)

int main()
{
	FILE* fp = fopen("abc.c", "w");  //文件指针
	if (!fp)
	{
		printf("fopen error");
		return -1;
	}

	fprintf(fp, "%d%c%d=%d\n", 10, '*', 7,10 * 7); //第一个参数是文件指针
	fclose(fp);

	system("pause");
	return 0;
}

效果如下

在这里插入图片描述

2.fscanf

​ fscanf就是读取文件内容以相应格式赋值给变量,fscanf不会读换行符

​ 函数原型 int fscanf(FILE * stream, const char * format, …);

注:

  1. 边界溢出。 存储读取的数据空间。在使用之前清空。

2)fscanf函数,每次在调用时都会判断下一次调用是否匹配参数2, 如果不匹配提前结束读文件。(feof(fp) 为真)。

#include<stdio.h>
#pragma warning(disable:4996)

void write_file()
{
	FILE* fp = fopen("abc.c", "w");  //文件指针
	if (!fp)
	{
		printf("fopen error");
		return -1;
	}

	fprintf(fp, "%d%c%d=%d\n", 10, '*', 7, 10 * 7); //第一个参数是文件指针
	fclose(fp);
}

void read_file()
{
	int a, b, c;
	char ch;

	FILE* fp = fopen("abc.c", "r");  //文件指针
	if (!fp)
	{
		printf("fopen error");
		return -1;
	}

	fscanf(fp, "%d%c%d=%d\n", &a, &ch, &b, &c); //第一个参数是文件指针
	printf("%d%c%d=%d\n", a, ch, b, c);

	fclose(fp);
}

int main()
{
	write_file();
	read_file();

	system("pause");
	return 0;
}

3. fgets

​ fgets函数和fscanf用法基本一样,补货fgets会把空格读进来

4.拷贝文件

​ 通过一个buf作为缓冲区实现,用fread和fwrite实现

1.fwrite函数原型

​ size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

​ 参1:待写出的数据的地址

​ 参2:待写出数据的大小

​ 参3:写出的个数 – 参2 x 参3 = 写出数据的总大小。

​ 参4:文件

​ 返回值: 成功:永远是 参3 的值。 — 通常将参2 传 1. 将参3传实际写出字节数。

​ 失败:0

2.fread函数原型

​ 从文件fp中读出数据。

​ size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

​ 参1:读取到的数据存储的位置

​ 参2:一次读取的字节数

​ 参3:读取的次数 – 参2 x 参3 = 读出数据的总大小

​ 参4:文件

​ 返回值: 成功:参数3. — 通常将参2 传 1. 将参3传欲读出的字节数。
​ 失败: 0读失败 – 到达文件结尾 – feof(fp)为真。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

void myfile_cp()
{
	FILE* rfp = fopen("note.txt", "r");
	FILE* wfp = fopen("mycopy.txt", "w");

	char buf[4096] = { 0 };  // 缓冲区。

	int ret = 0;

	while (1)
	{
		memset(buf, 0, sizeof(buf));
		ret = fread(buf, 1, sizeof(buf), rfp);
		if (ret == 0)
		{
			break;
		}
		printf("ret = %d\n", ret);
		fwrite(buf, 1, ret, wfp);
	}

	fclose(wfp);
	fclose(rfp);
}

int main(void)
{
	myfile_cp();

	printf("---------------------finish\n");

	system("pause");
	return EXIT_SUCCESS;
}

​ 当然拷贝mp3,avi格式也是一样的不过就是以2进制形式打开

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

void myfile_cp()
{
	FILE* rfp = fopen("kisstherain.mp3", "rb"); //就这里变了一下
	FILE* wfp = fopen("copy.mp3", "wb");

	char buf[5000] = { 0 };  // 缓冲区。

	int ret = 0;

	while (1)
	{
		memset(buf, 0, sizeof(buf));
		ret = fread(buf, 1, sizeof(buf), rfp);
		if (ret == 0)
		{
			break;
		}
		printf("ret = %d\n", ret);
		fwrite(buf, 1, ret, wfp);
	}

	fclose(wfp);
	fclose(rfp);
}

int main(void)
{
	myfile_cp();

	printf("---------------------finish\n");

	system("pause");
	return EXIT_SUCCESS;
}

5.文件移动位置的几个函数

​ 随机位置 读:

​ 文件读写指针。在一个文件内只有一个。

​ fseek():

​ int fseek(FILE *stream, long offset, int whence);

​ 参1:文件

​ 参2:偏移量(矢量: + 向后, - 向前)

​ 参3: SEEK_SET:文件开头位置

​ SEEK_CUR:当前位置

​ SEEK_END:文件结尾位置

​ 返回值: 成功:0, 失败: -1

​ ftell():

​ 获取文件读写指针位置。

​ long ftell(FILE *stream);

​ 返回:从文件当前读写位置到起始位置的偏移量。

​ 借助 ftell(fp) + fseek(fp, 0, SEEK_END); 来获取文件大小。

​ rewind():

​ 回卷文件读写指针。 将读写指针移动到起始位置。
​ void rewind(FILE *stream);

6.其他一些常用文件操作函数

1.获取文件状态:

​ 通过这个函数可以不打开文件,获取文件各种信息,需要加两个个头文件

#include<sys/types.h>
#include<sys/stat.h>

​ int stat(const char *path, struct stat *buf);

​ 参1: 访问文件的路径

​ 参2: 文件属性结构体

​ 返回值: 成功: 0, 失败: -1;

​ 以下是stat可以查询的文件信息

struct stat {
dev_t st_dev; //device 文件的设备编号
ino_t st_ino; //inode 文件的i-node
mode_t st_mode; //protection 文件的类型和存取的权限
nlink_t st_nlink; //number of hard links 连到该文件的硬连接数目, 刚建立的文件值为1.
uid_t st_uid; //user ID of owner 文件所有者的用户识别码 
gid_t st_gid; //group ID of owner 文件所有者的组识别码 
dev_t st_rdev; //device type 若此文件为装置设备文件, 则为其设备编号 
off_t st_size; //total size, in bytes 文件大小, 以字节计算 
unsigned long st_blksize; //blocksize for filesystem I/O 文件系统的I/O 缓冲区大小. 
u nsigned long st_blocks; //number of blocks allocated 占用文件区块的个数, 每一区块大小为512 个字节. 
time_t st_atime; //time of lastaccess 文件最近一次被存取或被执行的时间, 一般只有在用mknod、 utime、read、write 与tructate 时改变.
time_t st_mtime; //time of last modification 文件最后一次被修改的时间, 一般只有在用mknod、 utime 和write 时才会改变
time_t st_ctime; //time of last change i-node 最近一次被更改的时间, 此参数会在文件所有者、组、 权限被更改时更新 
};

​ 简单示例:

struct stat s;
int ret = stat("test.txt", &s);
printf("文件大小: %d\n", s.st_size);

2.删除、重命名文件:

​ int remove(const char *pathname); 删除文件。

​ int rename(const char *oldpath, const char *newpath); 重名文件

3.缓冲区刷新:

​ 标准输出-- stdout – 标准输出缓冲区。 写给屏幕的数据,都是先存缓冲区中,由缓冲区一次性刷新到物理设备(屏幕)

​ 标准输入 – stdin – 标准输入缓冲区。 从键盘读取的数据,直接读到 缓冲区中, 由缓冲区给程序提供数据。

​ 预读入、缓输出。

​ 行缓冲:printf(); 遇到\n就会将缓冲区中的数据刷新到物理设备上。

​ 全缓冲:文件。 缓冲区存满, 数据刷新到物理设备上。

​ 无缓冲:perror。 缓冲区中只要有数据,就立即刷新到物理设备。

​ 文件关闭时, 缓冲区会被自动刷新。 隐式回收:关闭文件、刷新缓冲区、释放malloc

​ 手动刷新缓冲区: 实时刷新。

​ int fflush(FILE *stream);

​ 成功:0

新到物理设备(屏幕)

​ 标准输入 – stdin – 标准输入缓冲区。 从键盘读取的数据,直接读到 缓冲区中, 由缓冲区给程序提供数据。

​ 预读入、缓输出。

​ 行缓冲:printf(); 遇到\n就会将缓冲区中的数据刷新到物理设备上。

​ 全缓冲:文件。 缓冲区存满, 数据刷新到物理设备上。

​ 无缓冲:perror。 缓冲区中只要有数据,就立即刷新到物理设备。

​ 文件关闭时, 缓冲区会被自动刷新。 隐式回收:关闭文件、刷新缓冲区、释放malloc

​ 手动刷新缓冲区: 实时刷新。

​ int fflush(FILE *stream);

​ 成功:0

​ 失败:-1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

白月光soul

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

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

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

打赏作者

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

抵扣说明:

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

余额充值