文件操作详解(二)

目录

一.文件的顺序读写

1.顺序读写函数(适合于所有的流)

1.1 fgetc(读字符)

一个字符一个字符地读

int fgetc(FILE* stream)

从文件中读(拿)字符
参数 是文件指针
返回值 是字符(转为了ASCII码值)
如果读取成功,返回的是ASCII码值 - char
如果读取错误,返回的是EOF(-1)

如果返回值类型是char,那么返回值肯定不等于-1(EOF),这样就没有返回错误与读到文件末尾了

c 复制代码
int main()
{
	FILE* pf = fopen("test.txt", "r");
	//以读的形式打开文件
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//不为NULL,使用
	char ch = 0;
	while ((ch = fgetc(pf))!= EOF)
	//fgetc读一个字符,光标就往下走一个字符
	//读到文件末尾,返回EOF
	{
		printf("%c\n", ch);
	}

	fclose(pf);
	//关闭文件
	pf = NULL;
	//文件指针不用了,置为空指针

	return 0;
}


1.2 fputc(写字符)

int fputc(int character,FILE* stream)

将字符一个一个地写入文件流中

第一个参数是要写入文件中的字符

第二个参数是文件流

c 复制代码
int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	
	for (char i = 'a'; i <= 'z'; i++)
	{
		fputc(i, pf);
		//把a到z的字符都写入文件中
	}

	fclose(pf);
	pf = NULL;

	return 0;
}

1.3 fgets(读字符串)

char* fgets(char* str,int num,FILE* stream)

第一个参数是从文件流中读出的字符串

第二个参数是重文件流中要读出的字符个数

第三个参数是文件流

如果读取错误或读到文件末尾返回NULL

如果读取成功返回str的起始地址
注意:

fgets会读num-1个字符,最后一位会留给\0(\0是自动放入的)

fgets只读一行,条件允许,把\n也读走

c 复制代码
int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读
	char str[20] = "xxxxxxxxxxxxxxx";
	fgets(str, 10, pf);
	printf("%s", str);

	fclose(pf);
	pf = NULL;

	return 0;
}


说明最后一位会自动补 \0

c 复制代码
int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读
	char str[20] = {0};
	fgets(str, 10, pf);
	printf("%s", str);

	fclose(pf);
	pf = NULL;

	return 0;
}


说明条件允许,把 \n 也读走了



说明fgets只读一行

1.4 fput(写字符串)

int fputs(const char* str,FILE* stream)

将str指向的字符串写入文件流中

如果写入成功返回一个整数

如果写入失败返回EOF

注意:

\n也会被写入文件中

不把\0写入文件中

c 复制代码
int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	fputs("abcdef\n", pf);
	
	fclose(pf);
	pf = NULL;

	return 0;
}

1.5 fscanf(格式化地读)

int fscanf(FILE* stream,const char* format)

从指定的输入流(文件或键盘等)上读取格式化的数据

第二个参数是格式化的数据

c 复制代码
struct s
{
	int a;
	char b;
	char arr[20];
}p;

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
    //读
	fscanf(pf, "%d %c %s", &(p.a), &(p.b), p.arr);

	//打印到屏幕上
	fprintf(stdout, "%d %c %s", p.a, p.b, p.arr);
	//stdout是标准输出流

	fclose(pf);
	pf = NULL;

	return 0;
}

1.6 fprintf(格式化地写)

int fprintf(FILE* stream,const char* str)

把数据以格式化的形式打印在指定的输出流(屏幕,文件等)上

c 复制代码
struct s
{
	int a;
	char b;
	char arr[20];
}p;

int main()
{
	struct s p = { 18,'a',"zhangsan"};
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写

	fprintf(pf, "%d %c %s",p.a,p.b,p.arr);

	fclose(pf);
	pf = NULL;

	return 0;
}

2.顺序读写函数(只适用于文件流)

2.1 fread(二进制地读)

size_t fread(const void* str,size_t size,size_t count,FILE* stream);

第一个参数是指向数组的指针

第二个参数是每个元素的大小(以字节为单位)

第三个参数是元素个数

c 复制代码
int main()
{
	FILE* pf = fopen("test.txt", "rb");
	// wb 以二进制的方式读出
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写数据
	int arr[10] = { 0 };
	/*fwrite(arr, sizeof(arr[0]), 6, pf);*/
	//以二进制的方式写入

	fread(arr, sizeof(arr[0]), 6, pf);
	//以二进制的方式读出
	for (int i = 0; i < 6; i++)
	{
		printf("%d ", arr[i]);
		//打印6个元素
	}

	fclose(pf);
	pf = NULL;

	return 0;
}

2.2 fwrite(二进制地写)

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

第一个参数是指向数组的指针

第二个参数是每个元素的大小(以字节为单位)

第三个参数是元素个数

c 复制代码
int main()
{
	FILE* pf = fopen("test.txt", "wb");
	// wb 以二进制的方式写入
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写数据
	int arr[] = { 1,2,3,4,5,6 };
	fwrite(arr, sizeof(arr[0]), 6, pf);
	//以二进制的方式写入

	fclose(pf);
	pf = NULL;

	return 0;
}

二.scanf、fscanf、sscanf的对比

scanf -- 从标准输入流(键盘)上读取格式化的数据

fscanf -- 从指定的输入流(文件或键盘等)上读取格式化的数据
sscanf -- 把字符串转为格式化的数据再读取(在字符串中读取格式化的数据)

int sscanf(const char* str,const char* format);

c 复制代码
int main()
{
	struct s p = { 18,'a',"zhangsan" };
	char buf[200];
	//写
	sprintf(buf, "%d %c %s", p.a, p.b, p.arr);
	//将格式化的数据转为字符串,写入buf中
	printf("%s\n", buf);
	//打印字符串buf

	struct s t = { 0 };
	//读
	sscanf(buf, "%d %c %s", &(t.a), &(t.b), t.arr);
	//从buf中读(拿)字符串,将字符串转为格式化的数据
	printf("%d %c %s", t.a, t.b, t.arr);
	//打印格式化的数据

	return 0;
}

三.printf、fprintf、sprintf的对比

printf -- 把数据以格式化的形式打印在屏幕上

fprintf -- 把数据以格式化的形式打印到指定的输出流(例如屏幕,文件等)上
sprintf -- 把格式化的数据转为字符串(将格式化数据写入字符串)

int sprintf(char* str,const char* format);

相关推荐
就爱学编程5 小时前
重生之我在异世界学编程之C语言:数据在内存中的存储篇(下)
java·服务器·c语言
落羽的落羽6 小时前
【落羽的落羽 C语言篇】动态内存管理·下
c语言
叫我阿呆就好了7 小时前
C 实现植物大战僵尸(一)
c语言·开发语言
柒月的猫7 小时前
求和(2022蓝桥杯A组试题C)
c语言·算法·蓝桥杯
Ning_.9 小时前
力扣第116题:填充每个节点的下一个右侧节点指针 - C语言解法
c语言·算法·leetcode
挥剑决浮云 -10 小时前
STM32学习之 按键/光敏电阻 控制 LED/蜂鸣器
c语言·经验分享·stm32·单片机·嵌入式硬件·学习
zfenggo10 小时前
c/c++ 无法跳转定义
c语言·开发语言·c++
图灵猿10 小时前
【Lua之·Lua与C/C++交互·Lua CAPI访问栈操作】
c语言·c++·lua
A懿轩A11 小时前
C/C++ 数据结构与算法【树和二叉树】 树和二叉树,二叉树先中后序遍历详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·二叉树·
WPG大大通16 小时前
基于DIODES AP43781+PI3USB31531+PI3DPX1207C的USB-C PD& Video 之全功能显示器连接端口方案
c语言·开发语言·计算机外设·开发板·电源·大大通