文件操作
为什么使用文件

什么是文件

程序文件

数据文件

文件名

文件的打开和关闭
文件指针


 只要没打开一个文件就会有一个文件信息区,只要一更改文件信息区也会跟着更改
 
**FILE *fopen( const char filename, const char mode );
 filename 文件名
 *char mode 打开方式
w 以写的形式为打开,即使源文件有内容也会清空 文件打开失败返回空指针
 
 
int main()
{
	FILE* pf = fopen("test.dat", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
		//写文件
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}
 
文件的顺序读写

 
int main()
{
	FILE* pf = fopen("test.dat", "w");//
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	fputc('n', pf);//第一个是内容  第二个是指针
//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}
 
int main()
{
	fputc('b', stdout);
	fputc('i', stdout);
	fputc('t', stdout);
	return 0;
}//在屏幕上打印bit没有在文件里
 
读取文件fgetc
如果读取正常返回字符ascii’值 如果失败返回eof
//EOF  他其实就是-1
//使用fgetc从文件流中读取数据
int main()
{
	FILE* pf = fopen("test.dat", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读文件 读出当前文件夹内容
	int ret = fgetc(pf);
	printf("%c\n", ret);
    ret = fgetc(pf);
	printf("%c\n", ret);
	ret = fgetc(pf);
	printf("%c\n", ret);
	ret = fgetc(pf);
	printf("%c\n", ret);
	ret = fgetc(pf);
	printf("%c\n", ret);
	ret = fgetc(pf);
	printf("%c\n", ret);
	ret = fgetc(pf);
	printf("%c\n", ret);//读取结束或者错误的时候返回-1
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}
 
fgetc从标准输入流读取
int main()
{
	int ret = fgetc(stdin);
	printf("%c\n", ret);
	ret = fgetc(stdin);
	printf("%c\n", ret);
	ret = fgetc(stdin);
	printf("%c\n", ret);
	return 0;
}
 
以行的形式
int main()
{
	FILE* pf = fopen("test.dat", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件-按照行来写
	fputs("abcdef\n", pf);
	fputs("qwertyuiop\n", pf);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}
 
以读的形式
 **char *fgets( char string, int n, FILE stream );
 第一个读进来放入字符数组
 n是读取的最大个数如果是100 实际是99
int main()
{
	char arr[10] ={0};
	FILE* pf = fopen("test.dat", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读文件
	fgets(arr, 4, pf);//实际读了4个最后放了个\0
	printf("%s\n", arr);
	//下一次读取是从是从上一次未读取完的开始的
	fgets(arr, 4, pf);
	printf("%s\n", arr);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}
 
格式化输入函数

 写文件
int main()
{
	struct S s = { "abcdef", 10, 5.5f };
	//对格式化的数据进行写文件
	FILE*pf = fopen("test.dat", "w");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	fprintf(pf, "%s %d %f", s.arr, s.num, s.sc);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}
 
如何读出来并且还原结构体
struct S
{
	char arr[10];
	int num;
	float sc;
};
int main()
{
	struct S s = {0};
	//对格式化的数据进行写文件
	FILE* pf = fopen("test.dat", "r");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//读文件
	fscanf(pf, "%s %d %f", s.arr, &(s.num), &(s.sc));//读的数据放在那里。   s. s.
	//打印
	fprintf(stdout, "%s %d %f\n", s.arr, s.num, s.sc);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}
 
二进制输入
size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
void *buffer, 指针你要写哪个数据把地址传过来
 size_t size, 元素大小 字节
 ize_t count,最多写多少个
//二进制的读写
struct S
{
	char arr[10];
	int num;
	float sc;
};
int main()
{
	struct S s = { "abcde", 10, 5.5f };
	//二进制的形式写
	FILE*pf = fopen("test.dat", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	fwrite(&s, sizeof(struct S), 1, pf);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}
 
fread读取
struct S
{
	char arr[10];
	int num;
	float sc;
};
int main()
{
	struct S s = {0};
	//二进制的形式读
	FILE*pf = fopen("test.dat", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读文件
	fread(&s, sizeof(struct S), 1, pf);
	printf("%s %d %f\n", s.arr, s.num, s.sc);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}
                

















