C文件操作

目录

文件:

什么是文件

程序文件:

数据文件

 文件操作理解:

 文件名

文件的打开和关闭

文件指针

文件的打开和关闭

文件的使用方式:

文件的读写:

 ​编辑

fputc

​编辑fgetc

 fputs

fgets

perror

fprintf

​编辑

fscanf

​编辑

流:

fwrite

fread

对比函数:

 sscanf

sprintf

文件的随机读写

fseek

ftell

rewind


文件:

什么是文件

磁盘上的文件是文件。

程序文件:

 源文件,目标文件和可执行程序是程序文件。

数据文件

文件的内容是程序运行时读写的数据。

 文件操作理解:

C文件操作_第1张图片

文件操作就是在程序中对硬盘上的文件进行写(输出)和读(输入)。

C文件操作_第2张图片

文件操作:我们通过文件指针找到对应文件信息,并对文件进行处理

 文件名

C文件操作_第3张图片

 文件名的组成:文件路径加上文件名。

文件的打开和关闭

文件指针

C文件操作_第4张图片

当打开一个文件时,硬盘上的文件会在内存中开辟对应的文件信息区,文件信息区存储的是该文件的数据,文件信息区定义形如:

struct _iobuf{
	char* _ptr;
	int _cnt;
	char*_base;
	int _flag;
	int _file;
	int _charbuf;
	int _bufsiz;
	char* _tmpfname;
};
typedef struct _iobuf FILE;

 一个结构体,上面存储了该文件的全部数据和信息。

这个结构体类型是FILE。

结构体指针就是FILE*,指向该文件信息区。

我们通过文件指针FILE*可以找到对应文件完成文件操作。

文件的打开和关闭

fopen:打开文件

以什么方式打开哪一个文件。 

C文件操作_第5张图片

fclose:关闭文件

#include
#include
#include

int main()
{
	FILE*pf = fopen("test.txt", "r");//以读的形式打开文件test.txt
	if (pf == NULL)//文件读取失败时返回空指针
	{
		printf("%s\n", strerror(errno));//打印错误信息
		return 1;
	}
	//...
	//读文件

	fclose(pf);//关闭文件
	pf = NULL;//防止后续操作对文件指针进行修改。
	return 0;
}

读取文件时,文件必须存在。

读取其他路径下的文件:

C文件操作_第6张图片

FILE*pf = fopen("C:\\Users\\13902\\Desktop", "r");//读其他路径下的文件需要加上'\'进行传义

文件的使用方式:

C文件操作_第7张图片

文件的读写:

 C文件操作_第8张图片

fputc

C文件操作_第9张图片

表示把字符写入到文件流中去。

C文件操作_第10张图片fgetc

 从文件中读取一个字符。

int main()
{
	FILE*pf = fopen("test.txt", "r");//读其他路径下的文件需要加上'\'进行传义
	if (pf == NULL)//文件读取失败时返回空指针
	{
		printf("%s\n", strerror(errno));//打印错误信息
		return 1;
	}
	//...
	//读文件
	/*char i = 0;
	for (i = 'a'; i <'z'; i++)
	{
		fputc(i, pf);
	}*/
	char ch = fgetc(pf);
	cout << ch << endl;
	fclose(pf);//关闭文件
	pf = NULL;//防止后续操作对文件指针进行修改。
	return 0;
}

fgetc函数表示从文件中读取一个字符,读取成功时,返回该字符,读取失败是,返回EOF。

 fputs

C文件操作_第11张图片

写一行数据到文件中。

int main()
{
	FILE*pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	//...
	//读文件
	/*char i = 0;
	for (i = 'a'; i <'z'; i++)
	{
	fputc(i, pf);
	}*/
	/*char ch = fgetc(pf);
	cout << ch << endl;
	while ((ch = fgetc(pf)) != EOF)
	{
	printf("%c ", ch);
	}*/
	fputs("zhanmusi ", pf);
	fclose(pf);
	pf = NULL;
	return 0;
}

fgets

从文件中读一行数据。

C文件操作_第12张图片

int main()
{
	FILE*pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	//...
	//读文件
	/*char i = 0;
	for (i = 'a'; i <'z'; i++)
	{
	fputc(i, pf);
	}*/
	/*char ch = fgetc(pf);
	cout << ch << endl;
	while ((ch = fgetc(pf)) != EOF)
	{
	printf("%c ", ch);
	}*/
	char arr[20] = { 0 };
	fgets(arr, 20, pf);
	cout << arr << endl;
	fclose(pf);
	pf = NULL;
	return 0;
}

perror

代替strerror,作用是打印错误信息。

 C文件操作_第13张图片

fprintf

写格式化数据到文件。

struct S
{
	char arr[10];
	int age;
	float score;
};
int main()
{
	struct S s = { "zhangsan", 25, 50 };  
	FILE*pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	fprintf(pf,"%s %d %f",s.arr,s.age,s.score);
	fclose(pf);
	pf = NULL;
	return 0;
}

fscanf

表示从文件中读取格式化数据

struct S
{
	char arr[10];
	int age;
	float score;
};
int main()
{
	struct S s = { 0 };  
	FILE*pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	fscanf(pf, "%s %d %f", s.arr, &s.age, &s.score);
	fclose(pf);
	pf = NULL;
	return 0;
}

流:

C文件操作_第14张图片

流是实现内存向不同外设输入数据时因外设的输入方式不同而创建的,类比接口。

我们只需要把内存中的数据输入给流,流来自动把数据输出给外设。

fwrite

C文件操作_第15张图片

把数据以二进位制形式写到文件。

struct S
{
	char arr[10];
	int age;
	float score;
};
int main()
{
	struct S s = { "zhangsan", 25, 50 };
	FILE*pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	/*fscanf(pf, "%s %d %f", s.arr, &s.age, &s.score);
	fprintf(stdout, "%s %d %f", s.arr, s.age, s.score);*/
	fwrite(&s, sizeof(s), 1, pf);
	fclose(pf);
	pf = NULL;
	return 0;
}

fread

从文件中以二进位制的形式读取。

struct S
{
	char arr[10];
	int age;
	float score;
};
int main()
{
	struct S s = { };
	FILE*pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	/*fscanf(pf, "%s %d %f", s.arr, &s.age, &s.score);
	fprintf(stdout, "%s %d %f", s.arr, s.age, s.score);*/
	/*fwrite(&s, sizeof(s), 1, pf);*/
	fread(&s, sizeof(s), 1, pf);
	printf("%s %d %f", s.arr, s.age, s.score);
	fclose(pf);
	pf = NULL;
	return 0;
}

对比函数:

 sscanf

从字符串中读格式化数据。

 本质上是把字符串转换为格式化数据

struct S
{
	char arr[10];
	int age;
	float score;
};
int main()
{
	struct S s = { "zhangsan", 25, 50 };
	struct S tmp = { 0 };
	char arr[100] = { 0 };
	sprintf(arr, "%s %d %f", s.arr, s.age, s.score);
	sscanf(arr, "%s %d %f", tmp.arr, &tmp.age, &tmp.score);
	/*cout << tmp << endl;*/
	printf("%s %d %f", tmp.arr, tmp.age, tmp.score);
	/*cout << arr << endl;*/
	return 0;
}

sprintf

写格式化数据到字符串(把格式化数据转换为字符串)

struct S
{
	char arr[10];
	int age;
	float score;
};
int main()
{
	struct S s = { "zhangsan", 25, 50 };
	char arr[100] = { 0 };
	sprintf(arr, "%s %d %f", s.arr, s.age, s.score);
	cout << arr << endl;
	return 0;
}

文件的随机读写

fseek

根据文件指针的位置和偏移量来定位文件指针。

C文件操作_第16张图片

orign有三个取值,分别代表开头,目前,末尾。

int main()
{
	FILE*pf = fopen("test.txt", "r");//读其他路径下的文件需要加上'\'进行传义
	if (pf == NULL)//文件读取失败时返回空指针
	{
		printf("%s\n", strerror(errno));//打印错误信息
		return 1;
	}
	//...
	//读文件
	/*char i = 0;
	for (i = 'a'; i <'z'; i++)
	{
		fputc(i, pf);
	}*/
	fseek(pf, 2, SEEK_SET);
	char ch = fgetc(pf);
	cout << ch << endl;
	fclose(pf);//关闭文件
	pf = NULL;//防止后续操作对文件指针进行修改。
	return 0;
}

ftell

返回文件指针相对于起始位置的偏移量。

int main()
{
	FILE*pf = fopen("test.txt", "r");//读其他路径下的文件需要加上'\'进行传义
	if (pf == NULL)//文件读取失败时返回空指针
	{
		printf("%s\n", strerror(errno));//打印错误信息
		return 1;
	}
	//...
	//读文件
	/*char i = 0;
	for (i = 'a'; i <'z'; i++)
	{
		fputc(i, pf);
	}*/
	fseek(pf, 2, SEEK_SET);
	/*char ch = fgetc(pf);
	cout << ch << endl;*/
	int a = ftell(pf);
	cout << a << endl;
	fclose(pf);//关闭文件
	pf = NULL;//防止后续操作对文件指针进行修改。
	return 0;
}

rewind

让文件指针的位置回到起始位置。

int main()
{
	FILE*pf = fopen("test.txt", "r");//读其他路径下的文件需要加上'\'进行传义
	if (pf == NULL)//文件读取失败时返回空指针
	{
		printf("%s\n", strerror(errno));//打印错误信息
		return 1;
	}
	//...
	//读文件
	/*char i = 0;
	for (i = 'a'; i <'z'; i++)
	{
		fputc(i, pf);
	}*/
	fseek(pf, 2, SEEK_SET);
	/*char ch = fgetc(pf);
	cout << ch << endl;*/
	int a = ftell(pf);
	cout << a << endl;
	rewind(pf);
	char ch = fgetc(pf);
	cout << ch;
	fclose(pf);//关闭文件
	pf = NULL;//防止后续操作对文件指针进行修改。
	return 0;
}

你可能感兴趣的:(服务器)