IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言-文件操作 -> 正文阅读

[C++知识库]C语言-文件操作

文件类型

根据数据的组织形式,数据文件被称为文本文件或者二进制文件
数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件
文本文件:拿记事本打开的文件都是文本文件


字符一律以ASCII形式存储,数据型数据既可以用ASCII形式存储,也可以使用二进制形式存储

文件缓冲区

ANSIC标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后一块送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将输入送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。

输出:从程序到磁盘
输入:从磁盘到程序

文件指针

每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件的状态及文件的位置等)。
这些信息是保存在一个结构体变量中,该结构体类型是FILE
不同C编译器,FILE类型包含的内容不完全相同
当打开文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充里面的信息,使用者不必关心细节

一般都是通过一个FILE的指针来维护这个FILE结构的变量
FILE* pf//

文件的打开和关闭

int main()
{
	FILE* pf = fopen("test.txt", "w");			//打开文件,不写路径就是当前目录
	if (pf == NULL)								//w表示写,文件不存在就创建一个新的文件,存在就把它的内容销毁
	{
		perror("fopen");
		return 1;
	}

	fclose(pf);									//关闭文件
	pf = NULL;									//释放指针
	return 0;
}

在这里插入图片描述

文件的顺序读写

字符输入函数 - fgetc

int fgetc( FILE *stream );
Read a character from a stream (fgetc, fgetwc) or stdin (_fgetchar, _fgetwchar).

fgetc()读取成功返回读到的字符,读取到文件末尾或读取失败时返回EOF
EOF - END IF FILE 文件结束标准 值为-1
stream是文件流,流是程序输入或输出的一个连续的字节序列,设备的输入输出都是用流来处理的。
stdin	标准输入	键盘
stdout	标准输出	屏幕
int main()
{
	int n = 0;
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	while((n=fgetc(fp))!=EOF)
	{
		printf("%d\n",n);
	}

	return 0;
}

字符输出函数 - fputc

int fputc( int c, FILE *stream );
Writes a character to a stream (fputc, fputwc) or to stdout (_fputchar, _fputwchar).

向指定的文件写入一个字符
写入成功返回写入的字符,失败时返回EOF
int main()
{
	FILE* fp = fopen("test.txt", "w");
	if (fp == NULL)
	{
		perror("fopen");
		return 1;
	}

	char ch = 'a';
	fputc(ch, fp);				//把ch的内容写入到fp指定的文件中

	fclose(fp);
	fp = NULL;

	return 0;
}

在这里插入图片描述

文本行输入函数 - fgets

char *fgets( char *string, int n, FILE *stream );
Get a string from a stream.

从指定的文件中读取一个字符串,并保存到一个字符数组中
int main()
{
	FILE* fp = fopen("test.txt", "r");
	if (fp == NULL)
	{
		perror("fopen");
		return 1;
	}

	char str[100] = { 0 };
	fgets(str, 5, fp);				//读到的字符串要把'\0'也算里,实际上得到的是n-1个字符

	printf("%s\n", str);

	fclose(fp);
	fp = NULL;

	return 0;
}

在这里插入图片描述

本文行输出函数 - fputs

int fputs( const char *string, FILE *stream );
Write a string to a stream.

向指定的文件写一个字符串
写入成功返回非负数,失败返回EOF
int main()
{
	FILE* fp = fopen("test.txt", "w");
	if (fp == NULL)
	{
		perror("fopen");
		return 1;
	}

	fputs("hello world\n", fp);				//默认是不换行的
	fputs("haha\n", fp);

	fclose(fp);
	fp = NULL;
	return 0;
}

文件拷贝

int main()
{
	FILE* fp = fopen("test1.txt", "r");
	if (fp == NULL)
	{
		perror("fopen");
		return 1;
	}

	FILE* fpp = fopen("test2.txt", "w");
	if (fpp == NULL)
	{
		perror("fopen tw");
		return 1;
	}

	int ch = 0;
	while ((ch = fgetc(fp))!=EOF)
	{
		fputc(ch, fpp);
	}

	fclose(fp);
	fp = NULL;
	fclose(fpp);
	fpp = NULL;

	return 0;
}
//把test1的内容拷贝到test2

格式化输入函数 - fscanf

int fscanf( FILE *stream, const char *format [, argument ]... );
Read formatted data from a stream.

从磁盘中读取内容
从一个流中格式化输入,遇到空格和换行时结束
成功返回输入参数的个数,失败返回EOF
struct Stu 
{
	char name[20];
	int age;
	char sex[5];
};

int main()
{
	struct Stu s = { 0 };
	FILE* fp = fopen("test.txt", "r");
	if (fp == NULL)
	{
		perror("fopen");
		return 1;
	}


	fscanf(fp, "%s %d %s", s.name, &(s.age), s.sex);

	printf("%s %d %s\n", s.name, s.age, s.sex);

	fclose(fp);
	fp = NULL;

	return 0;
}
//把文本里面的数据读到结构体中

格式化输出函数 - fprintf

int fprintf( FILE *stream, const char *format [, argument ]...);
Print formatted data to a stream.
struct Stu
{
	char name[20];
	int age;
	char sex[5];
};

int main()
{
	struct Stu s = { "zhangsan",18,"man" };
	FILE* fp = fopen("test.txt", "w");
	if (fp == NULL)
	{
		perror("fopen");
		return 1;
	}

	fprintf(fp, "%s %d %s", s.name, s.age, s.sex);

	fclose(fp);
	fp = NULL;

	return 0;
}
//把结构体的数据写到文件中,不能有空格

sprintf

int sprintf( char *buffer, const char *format [, argument] ... );
Write formatted data to a string.


struct Stu
{
	char name[20];
	int age;
	char sex[5];
};

int main()
{
	struct Stu s = { "zhangsan",18,"man" };

	char str[100] = { 0 };
	sprintf(str, "%s%d%s", s.name, s.age, s.sex);

	printf("%s\n", str);
	return 0;
}
//把数据转换成字符串

sscanf

int sscanf( const char *buffer, const char *format [, argument ] ... );
Read formatted data from a string.

#include <stdio.h>

struct Stu
{
	char name[20];
	int age;
	char sex[5];
};

int main()
{
	struct Stu s = { "zhangsan",18,"man" };
	struct Stu tmp = { 0 };
	char str[100] = { 0 };
	sprintf(str, "%s %d %s", s.name, s.age, s.sex);

	sscanf(str, "%s %d %s", tmp.name, &(tmp.age), tmp.sex);

	printf("%s %d %s\n", tmp.name,tmp.age,tmp.sex);
	return 0;
}//把str内的数据保存到tmp中

二进制输出函数 - fwrite

size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
Writes data to a stream.

size:每个元素的大小,以字节为单位
count:元素个数,每个元素的大小是size字节

int main()
{
	FILE* fp = fopen("test.txt", "wb");			//wb以二进制读
	if (fp == NULL)
	{
		perror("fopen");
		return 1;
	}

	char name[] = "zhangsan";

	fwrite(name, sizeof(name), 1, fp);		//把name里面的内容以二进制形式写到文件中

	fclose(fp);
	fp = NULL;

	return 0;
}

二进制输入函数 - fread

size_t fread( void *buffer, size_t size, size_t count, FILE *stream );	
Reads data from a stream.

从给定的输入流读取最多count个对象到数组中
int main()
{
	FILE* fp = fopen("test.txt", "rb");
	if (fp == NULL)
	{
		perror("fopen");
		return 1;
	}

	char name[100] = { 0 };

	fread(name, 8, 1, fp);

	printf("%s\n", name);

	fclose(fp);
	fp = NULL;
	return 0;
}

文件的随机读写

fseek

int fseek( FILE *stream, long offset, int origin );
Moves the file pointer to a specified location.

offset:偏移量
origin:位置
调整文件指针位置的函数
int main()
{
	FILE* fp = fopen("test.txt", "w");			
	if (fp == NULL)
	{
		perror("fopen");
		return 1;
	}
	fputs("ABCDEF", fp);

	fseek(fp, -3, SEEK_END);
	fputc('Q', fp);


	fclose(fp);
	fp = NULL;

	return 0;
}

ftell

long ftell( FILE *stream );
Gets the current position of a file pointer.

计算某一个位置相对于起始位置的偏移量
int main()
{
	FILE* fp = fopen("test.txt", "w");
	if (fp == NULL)
	{
		perror("fopen");
		return 1;
	}

	fputs("ABCDEF", fp);
	fseek(fp, 4, SEEK_SET);
	int ret = ftell(fp);
	printf("%d\n", ret);

	fclose(fp);
	fp = NULL;
	return 0;
}

rewind

void rewind( FILE *stream );
Repositions the file pointer to the beginning of a file.

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

文件结束的判定

在文件读取时,不能用feof函数的返回值直接用来判断文件是否结束
而是用于当文件读取结束的时候,判断是读取失败,还是遇到文件尾结束

1.文本文件读取是否结束,判断返回值是否为EOF(fgetc),或者NULL(fgets)
2.二进制文件的读取结束判断,判断返回值是否小于实际要读的个数
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-19 07:48:45  更:2021-09-19 07:50:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 22:25:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码