C语言文件操作的函数使用fopen、fwrite、fread、fseek、ftell、rewind和feof

一、什么是文件,文件包含什么,文件类型有什么???

答:文件:存储在磁盘上的文件是文件。C语言中我们谈的文件有两种**:程序文件和数据文件。**
程序文件 :包括源文件(.c),目标文件(windows环境是.obj),可执行文件(windows环境是.exe)
数据文件 :是程序运行时读写的数据,比如程序运行时需要从中读取数据的文件,或者输出内容的文件。
文件包含文件的内容和文件的属性。
C语言中的数据文件有二进制文件文本文件
二进制文件:数据存储时以二进制的形式存储,不加转换的输出到内存,就是二进制文件。
文本文件:如果要求在内存上以ASCII码存储,则需要在存储前转换。以ASCII字符的形式存储的文件时文本文件。

二、基本函数的使用

(1)、fopen函数
文件打开函数。
FILE*fopen(const char *filename,const char mode);
函数返回值是FILE
型(文件指针)
filename是要打开的文件名
mode是打开方式
打开方式有
r (只读,为了输入数据,打开一个已经存在的文本文件)、
w(只写,为了输出数据,打开一个文本文件)、
a(追加,向文件尾添加数据)、
rb(只读,打开一个已经存在的二进制文件),
wb(只写,为了输出数据,打开一个二进制文件),
r+(读写,打开一个文本文件)、
w+(读写,建议一个新的文件)
a+((读写,打开一个文件,在文件末尾添加数据);
rb+(为了读写,打开一个二进制文件)
wb+为了读写,新建一个新的二进制文件。
ab+打开一个二进制文件,文件尾进行读写。
举个例子:

#include<stdio.h>
#include<stdio.h>
#pragma warning(disable:4996)
int main()
{
	FILE* fp;
	fp = fopen("myfile.txt", "w");//如果没有这个文件,新建在源文件目录下。
	//也可以通过文件路径打开
	//文件打开,关闭,返回值都是FILE*型
	if (fp == NULL)
	{
		printf("open error");
		return 1;
	}
	else 
	{
		fputs("fopen example", fp);//将fopen输入到文件myfile.txt中
	}
	fclose(fp);//关闭函数
	return 0;
}

在这里插入图片描述
打开这个文件:右键源文件,添加,现有项,就会看到文件,添加在源文件目录下,右键,打开方式,最下边是二进制文件打开,最上边是文本文件打开。
如果你在以w形式打开一次文件,里边的东西会消失。
如果以r和方式打开,不会消失。

int main()
{
	FILE* fp;
	fp = fopen("myfile.txt", "w");
	if (fp == NULL)
	{
		printf("open error");
		return 1;
	}
	else//打开成功之后,之前写的fopen example 消失了。
	{
		fputs("hello wolrd", fp);//写入新的字符。
	}
	fclose(fp);
	fp=fopen("myfile.txt", "r");
	if (fp == NULL)
	{
		printf("open error");
		return 1;
	}//如果打开成功,hello world还在。
	fclose(fp);
	fp = fopen("myfile.txt", "a");
	if (fp == NULL)
	{
		printf("open error");
		return 1;
	}
	else
	{
		fputs("123a45", fp);//在文件末尾在添加字符
	}
	fclose(fp);

	return 0;

结果如下:在这里插入图片描述

(2)、fseek函数
跟据文件指针的位置和偏移量来定位文件指针。
int fseek (FILE* stream,long int offset ,int origin)
stream :想对那个文件修改,offset :偏移量,origin :选择基准,有SEEK_SET(从起始位置开始)、SEEK_END(从文件末尾开始)、SEEK_CUR(文件指针指向的当前位置)
举个例子:

int main()
{
	FILE* fp;
	fp = fopen("myfile.txt", "wb");
	if(fp==NULL{
		perror("Error opening file.");
	}
	else
	{
		fputs("This is an apple .",fp);
		fseek(fp, 9, SEEK_SET);//从起始位置,数9个开始修改
		fputs("sam", fp);//用sam替换了三个。
	}
	fclose(fp);
	return 0;
}

在这里插入图片描述

(3)、ftell函数
ftell函数返回文件相对于起始位置的偏移量;
long int ftell(FILE * stream);
举个例子:

int main()
{
	long size=0;
	FILE* fp;
	fp = fopen("myfile.txt", "r");//内容是 This is asampple.
	if (fp == NULL)
	{
		perror("Error opening file");//打印错误信息。
	}
	else
	{
		fseek(fp, 0, SEEK_END);//让fp指向文件尾,偏移量就是整个文件的大小。
		size = ftell(fp);
		printf("size of myfile.txt :%ld bytes.\n", size);
	}
	return 0;
}//可以计算文件的大小

在这里插入图片描述
(4)、rewind 函数
让文件指针的位置回到文件的起始位置。
void rewind(FILE*stream)
和fseek 的fseek(fp,0,SEEK_SET),相似。
举个例子:

int main()
{
	int n = 0;
	FILE* fp;
	char buffer[27];
	fp = fopen("myfile.txt", "w+");//原始内容被清除
	if (fp == NULL)
	{
		perror("Error opening file");
	}
	else
	{
		for (n = 'A'; n <= 'Z'; n++)
		{
			fputc(n, fp);//写完之后文件指针在文件末尾
		}
		rewind(fp);//文件指针在文件初始位置
		fread(buffer, 1, 26, fp);
		//从fp文件中读取26的大小为1字节的数据,放到buffer中
	}
	fclose(fp);
	buffer[26] = '\0';
	puts(buffer);//buffer打印在显示器上
	return 0;
}

在这里插入图片描述
(5)fread函数
size_t fread(void ptr,size_t size ,size_t count,FILEfp)
将fp中的count个大小为size的数据读入ptr中。
(6)fwrite函数
size_t fwrite(void ptr,size_t size ,size_t count,FILEfp)
将ptr 内容写在fp中,size 一个的大小,count 多少个。
这两个函数在其他函数例子中会使用到,就不举例子了。
(7)feof函数
用feof判断文件读取结束。
文本文件判断结尾的时候不能直接使用feof函数的返回值直接判断,要文本文件一直读取,直到读取出错,在用feof判断。
文本文件读取是否结束后,判断返回值EOF(fgetc),NULL(fgets);
文件读取结束有两种可能,1 读取出错,2读取结束,所以不能直接使用feof,
举例子:

#include<stdio.h>
#include<stdio.h>
#pragma warning(disable:4996)
int main()
{
	char buffer[100];
	int c;
	FILE* fp = fopen("myfile.txt", "r");
	if (fp == NULL)
	{
		printf("open error");
		return 1;
	}
	else
	{
		if (fgets(buffer,100,fp) != NULL)
		{
			puts(buffer);
		}
		/*while ((c = fgetc(fp)) != EOF)
		{
			putchar(c);
		}*/
		if (feof(fp))
		{
			puts("End of file reached successfully");
		}
	}
	return 0;
}

判断二进制文件读取是否结束
fread 判断返回值是否小于实际要读的个数。
例子:

#include<stdio.h>
#include<stdio.h>
#pragma warning(disable:4996)
enum {SIZE =8};
int main()
{
	double a[SIZE] = { 1.0 ,2.0, 3.0, 4.0, 5.0 ,6.0,7.0,8.0};
	double b=0.0;
	size_t ret = 0;
	FILE* fp = fopen("hehe.bin", "wb");
	if (fp == NULL)
	{
		return 1;
	}
	else
	{
		fwrite(a, sizeof(double), SIZE, fp);
	}
	fclose(fp);
	fp = fopen("hehe.bin", "rb");
	while ((ret = fread(&b, sizeof(double), 1, fp)) >= 1)
	{
		printf("%lf", b);
	}
	if (feof(fp))
	{
		printf("Error reading :unexpected end of file\n");
	}
	fclose(fp);
	return 0;
}
  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值