详解C文件操作

Posted 跳动的bit

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解C文件操作相关的知识,希望对你有一定的参考价值。

一、文件的打开和关闭及打开方式

💦 文件打开方式

注:作者懒的很,不会写完

💦 fopen 和 fclose

⭕ 函数信息

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	//使用文件指针接收
	FILE* pf = fopen("first file.txt", "w");
	//判断文件是否打开成功
	if(pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	//写文件
	//...
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

💨 结果


以写的形式打开文件:如果没有目标文件,它会在目录下生成文件;如果有目标文件,且目标文件里有内容时,会重新新建空白文件并替换原来的文件


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main01()
{
	FILE* pf = fopen("FirstFile.txt", "r");
	if(pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	//写文件
	//...
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}
int main()
{	
	//fopen可以打开绝对路径的文件,但是必须注意编译器会把\\理解为转义字符
	FILE* pf = fopen("C:\\\\Users\\\\MACHENIKE\\\\Desktop\\\\test\\\\FirstFile.txt", "r");
	if(pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	//写文件
	//...
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

💨 结果

以读的形式打开文件:如果没有目标文件时它会返回空指针

四、文件的顺序读写

💦 主要函数

💦 什么是流

流是一个高度抽象的概念。C程序只要运行起来,就会默认打开三个流:

1️⃣ stdin:标准输入流 - 键盘

2️⃣ stdout:标准输出流 - 屏幕

3️⃣ stderr:标准错误流 - 屏幕

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	//从标准输出流里输入数据
	fputc('b', stdout);//同printf("b");
	fputc('i', stdout);
	fputc('t', stdout);
	/*------------------分割-----------------*/
	//从标准输入流里读取数据
	int ret = fgetc(stdin);//同scanf("%d", ret);
	printf("%c\\n", ret);
	ret = fgetc(stdin);
	printf("%c\\n", ret);
	ret = fgetc(stdin);
	printf("%c\\n", ret);
	return 0;
}

💨 结果

💦 fputc 和 fgetc

🎗 同样的,也可以向文件流输入、输出数据
⭕ 函数信息

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	FILE* pf1 = fopen("FirstFile.txt", "w");
	if (pf1 == NULL)
	{
		perror("fopen");
		return 0;
	}
	//从标准输出流里输入数据
	fputc('b', pf1);
	fputc('i', pf1);
	fputc('t', pf1);
	fclose(pf1);
	pf1 = NULL;
	/*------------------分割-----------------*/
	//从标准输入流里读取数据
	FILE* pf2 = fopen("FirstFile.txt", "r");
	int ret = fgetc(pf2); 
	printf("%c", ret);
	ret = fgetc(pf2);
	printf("%c", ret);
	ret = fgetc(pf2);
	printf("%c", ret);
	//关闭文件 
	return 0;
}

💨 结果

💦 fputs 和 fgets

⭕ 函数信息

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	FILE* pf1 = fopen("FirstFile.txt", "w");
	if(pf1 == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件 - 写一行 (如果需要写2行的话需要+\\n)
	fputs("helloworld\\n", pf1);
	fputs("hello bit\\n", pf1);
	//关闭文件 
	fclose(pf1);
	pf1 = NULL;
	/*------------------分割-----------------*/
	char arr[20] = { 0 };//用于存储读出的数据
	FILE* pf2 = fopen("FirstFile.txt", "r");
	if(pf2 == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读一行 (注意在读取的时候,要留1个位置给'\\0',如果读多行的话它会先把流里的第一行的全部读完,才能再读第二行)
	fgets(arr, 4, pf2);
	printf("%s\\n", arr);
	fgets(arr, 4, pf2);
	printf("%s\\n", arr);
	//关闭文件 
	fclose(pf2);
	pf2 = NULL;
	return 0;
}

💨 结果

💦 fscanf 和 fprintf

⭕ 函数信息


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
struct S
{
	char arr[10];
	int num;
	float sc;
};
int main()
{
	struct S s = { "abcdef", 10, 5.5f };
	FILE* pf1 = fopen("FirstFile.txt", "w");
	if(pf1 == NULL)
	{
		perror("fopen");
		return 1;
	}
	//将结构体格式化的数据写入文件
	fprintf(pf1, "%s %d %f", s.arr, s.num, s.sc);
	//关闭文件 
	fclose(pf1);
	pf1 = NULL;
	/*------------------分割-----------------*/
	struct S temp = { 0 };//用于存储读出的数据 
	FILE* pf2 = fopen("FirstFile.txt", "r");
	if(pf2 == NULL)
	{
		perror("fopen");
		return 1;
	}
	//再把数据从文件中读到结构体中
	fscanf(pf2, "%s %d %f", temp.arr, &(temp.num), &(temp.sc));
	//打印
	printf("%s %d %f\\n", temp.arr, temp.num, temp.sc);
	//关闭文件 
	fclose(pf2);
	pf2 = NULL;
	return 0;
}

💨 结果

💦 fread 和 fwrite

⭕ 函数信息


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
struct S
{
	char arr[10];
	int num;
	float sc;
};
int main()
{
	struct S s = { "abcdef", 10, 5.5f };
	FILE* pf1 = fopen("FirstFile.txt", "w");
	if(pf1 == NULL)
	{
		perror("fopen");
		return 1;
	}
	//以二进制的形式写文件 
	fwrite(&s, sizeof(struct S), 1, pf1);
	//关闭文件 
	fclose(pf1);
	pf1 = NULL;
	/*------------------分割-----------------*/
	struct S temp = { 0 };//以二进制的形式读文件 
	FILE* pf2 = fopen("FirstFile.txt", "r");
	if(pf2 == NULL)
	{
		perror("fopen");
		return 1;
	}
	//再把数据从文件中读到结构体中
	fread(&temp, sizeof(struct S), 1, pf2);
	//打印
	printf("%s %d %f\\n", temp.arr, temp.num, temp.sc);
	//关闭文件 
	fclose(pf2);
	pf2 = NULL;
	return 0;
}

💨 结果

💦 对比几组函数

1️⃣
scanf:针对标准输入的格式化的输入语句 - stdin
printf:针对标准输出的格式化的输出语句 - stdout
2️⃣
fscanf:针对所有输入流的格式化的输入语句 - stdin/文件流
fprintf:针对所有输出流的格式化的输出语句 - stdout/文件流
3️⃣
sscanf:从一个字符串中读取一个格式化的数据
sprintf:把一个格式化的数据,转化成字符串

⭕ sprintf、sscanf函数信息

对比printf和scanf只是多了一个参数
​​

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
struct S
{
	char arr[10];
	int age;
	float f;
};
int main()
{
	struct S s1 = { "hello", 20, 5.5f };
	char buff[100] = { 0 };
	//把一个格式化的数据转换成字符串
	sprintf(buff, "%s %d %f", s1.arr, s1.age, s1.f);
	printf("%s\\n", buff);
	/*------------------分割-----------------*/
	struct S s2 = { 0 };
	//从buff中字符串中还原出一个结构体数据
	sscanf(buff, "%s %d %f", s2.arr, &(s2.age), &(s2.f));
	printf("%s %d %f\\n", s2.arr, s2.age, s2.f);
	return 0;
}

💨 结果

五、文件的随机读写

💦 fseek

⭕ 函数信息

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	FILE* pf1 = fopen("FirstFile.txt", "w");
	if(pf1 == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件 
	fputs("abcdef", pf1);
	//关闭文件 
	fclose(pf1);
	pf1 = NULL;
	/*------------------分割-----------------*/
	FILE* pf2 = fopen("FirstFile.txt", "r");
	if(pf2 == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读文件 - abcdef
	int ret = fgetc(pf2);
	printf("%c\\n", ret);
	//调整文件指针
	//fseek(pf2, -1, SEEK_CUR);//a a b -  从文件指针当前位置偏移-1 
	//fseek(pf2, 2, SEEK_SET);//a c d - 从文件开头的位置a偏移2
	fseek(pf2, -3, SEEK_END);//a d e - 从文件结尾的位置向前偏移3
	ret = fgetc(pf2);
	printf("%c\\n", ret);
	ret = fgetc(pf2);
	printf("%c\\n", ret); 
	 
	//关闭文件 
	fclose(pf2);
	pf2 = NULL;
	return 0;	
}

💦 ftell

⭕ 函数信息

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	FILE* pf1 = fopen("FirstFile.txt", "w");
	if(pf1 == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件 
	fputs("abcdef", pf1);
	//关闭文件 
	fclose(pf1);
	pf1 = NULL;
	/*------------------分割-----------------*/
	FILE* pf2 = fopen("FirstFile.txt", "r");
	if(pf2 == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读文件 - abcdef
	int ret = fgetc(pf2);
	printf("%c\\n", ret);//a
	ret = fgetc(pf2);
	printf("%c\\n", ret);//b
	ret = fgetc(pf2);
	printf("%c\\n", ret); //c
	//计算当前文件指针位置相对于起始位置的偏移量
	int set = ftell(pf2);
	printf("%d\\n", set);//3 - c对于起始位置偏移量为3
	 
	//关闭文件 
	fclose(pf2);
	pf2 = NULL;
	return 0;	
}

💦 rewind

⭕ 函数信息

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	FILE* pf1 = fopen("FirstFile.txt", "w");
	if(pf1 == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件 
	fputs("abcdef", pf1);
	//关闭文件 
	fclose(pf1);
	pf1 = NULL;
	/*------------------分割-----------------*/
	FILE* pf2 = fopen("FirstFile.txt", "r");
	if(pf2 == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读文件 - abcdef
	int ret = fgetc(pf2);
	printf("%c\\n", ret);//a
	ret = fgetc(pf2);
	printf("%c\\n", ret);//b
	ret = fgetc(pf2);
	printf("%c\\n", ret); //c
	int set = ftell(pf2);
	//让文件指针回到起始位置
	rewind(pf2);
	ret = fgetc(pf2);
	printf("%c\\n", ret20160226.CCPP体系详解(0036天)

20160226.CCPP体系详解(0036天)

14.VisualVM使用详解15.VisualVM堆查看器使用的内存不足19.class文件--文件结构--魔数20.文件结构--常量池21.文件结构访问标志(2个字节)22.类加载机制概(代码片段

C/C++程序编译过程详解

C/C++程序编译过程详解

jQuery的DOM操作