C/C++文件操作(细节满满,part2)

这篇具有很好参考价值的文章主要介绍了C/C++文件操作(细节满满,part2)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

该文章上一篇:C/C++文件操作(细节满满,part1)_仍有未知等待探索的博客-CSDN博客

个人主页:仍有未知等待探索_C语言疑难,数据结构,小项目-CSDN博客

专题分栏:C语言疑难_仍有未知等待探索的博客-CSDN博客

目录

 

一、引言

二、文件的顺序

1、输入流和输出流

2、fputc

1.功能

2. 参数

3.用法

4.注意 

3、fgetc

1.功能 

2.参数

3.用法

4、fputs 

1、功能 

2、参数

3、用法

5、fgets 

​编辑 1、功能 

2、参数

3、用法

4、注意 

6、fprintf

1、功能 

2、参数

3、用法 

7、fscanf 

1、功能

2、参数

3、 用法

8、fwrite

​编辑

1、功能

2、参数

3、用法

4、注意 

9、fread 

1、功能

2、参数

3、用法

4、注意 

三、文件的随机读写

1、fseek

2、ftell 

3、rewind 

四、二进制文件和文本文件

五、文件读取结束的标志

1、文本文件读取结束标志

2、二进制文件读取结束标志

六、文件缓冲区


 

一、引言

通过上篇文章,已经了解了什么是文件打开和关闭文件的操作流的概念等。

如果对于上述的内容感到有点陌生了,不妨去看一看,文章链接在开头。

这篇文章的内容将会包含写文件的基本操作。

文件的顺序读写:是每次从第一个字符开始读和写。

文件的随机读写:是每次可以从任意一个位置读和写。

二、文件的顺序

适用文件 功能 函数名 适用于
文本文件 字符输入函数 fgetc 所有输入流
文本文件 字符输出函数 fputc 所有输出流
文本文件 文本行输入函数 fgets 所有输入流
文本文件 文本行输出函数 fputs 所有输出流
文本文件 格式化输入函数 fscanf 所有输入流
文本文件 格式化输出函数 fprintf 所有输出流
二进制文件 二进制输入 fread 文件
二进制文件 二进制输出 fwrite 文件

1、输入流和输出流

流相当于是一个过渡的过程。怎么判上述函数是输入流还是输出流呢?

我们可以站在内存的视角来看,如果是数据流向内存,我们就可以看作是输入流。反之,则是输出流。

就以fgetc和fputc为例:

C/C++文件操作(细节满满,part2),C语言疑难,c语言,开发语言

2、fputc

C/C++文件操作(细节满满,part2),C语言疑难,c语言,开发语言

1.功能

将一个字符character写进stream流中。

2. 参数

character:字符(字符的本质就是ASCII码值,是整数)。

stream:文件指针。

3.用法

#include<stdio.h>
int main()
{
    //以‘只写’的方式打开文件
	FILE* pf = fopen("test.txt", "w");
    if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	//处理
	//输入
	for (int i = 'a'; i <= 'z'; i++)
		fputc(i, pf);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

4.注意 

用什么方式打开文件就只能完成该功能。就比如说,以‘只写’的方式打开文件,就不能进行读取操作。

如果对于打开方式模糊了,请点击下面链接,查看上一篇的内容:

C/C++文件操作(细节满满,part1)_仍有未知等待探索的博客-CSDN博客

3、fgetc

C/C++文件操作(细节满满,part2),C语言疑难,c语言,开发语言

1.功能 

 从stream流中获取数据。

2.参数

文件指针类型的stream流。

3.用法

如果获取失败,函数将返回EOF

//以‘只读’的方式打开文件
	FILE* pf = fopen("test.txt", "r");
    if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	//处理
	//输出
	int ch;
	while((ch=fgetc(pf))!=EOF)
    {
        printf("%c ",ch);
    }
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

4、fputs 

C/C++文件操作(细节满满,part2),C语言疑难,c语言,开发语言

1、功能 

将一个字符串写入流中。

2、参数

str:需要写入文件的参数。

stream:文件流。

3、用法

如果没有‘\n’的话,他会把数据输入在一行。 

如果把文件指针pf换成stdout的话,程序会把数据打印在屏幕上。

#include<stdio.h>
int main()
{
	//以‘只写’的方式打开文件
	FILE* pf = fopen("test.txt", "w");
    if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	//处理
	fputs("abcd", pf);//不换行写法
	fputs("abcd\n", pf);//换行写法
    fputs("abcd", stdout);//将数据打印在屏幕上
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

C/C++文件操作(细节满满,part2),C语言疑难,c语言,开发语言

5、fgets 

C/C++文件操作(细节满满,part2),C语言疑难,c语言,开发语言 1、功能 

从流中获取字符串。

2、参数

str:字符串。

num:读取的个数。

stream:文件流。

3、用法

如果获取失败,函数将返回EOF

#include<stdio.h>
int main()
{
	//以‘只读’的方式打开文件
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	//处理
	char str[20];
	fgets(str, 10, pf);
	printf("%s", str);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

4、注意 

  1. 函数最多只会读取一行的数据。
  2. 当数据足够多时,参数为num,函数只会读取num-1个数据。

6、fprintf

C/C++文件操作(细节满满,part2),C语言疑难,c语言,开发语言

1、功能 

将格式化数据写入文件流中。

2、参数

通过将fprintf和printf的参数相比较,会发现,fprintf的参数就比printf的参数多了一个文件指针。 

C/C++文件操作(细节满满,part2),C语言疑难,c语言,开发语言

3、用法 

#include<stdio.h>
struct S
{
	float f;
	char ch;
	int n;
};
int main()
{
	struct S s = { 4.14f,'w',1 };
	//以‘只 写’的方式打开文件
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	//处理
	printf("%f %c %d\n", s.f, s.ch, s.n);
	fprintf(pf,"%f %c %d\n", s.f, s.ch, s.n);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

7、fscanf 

C/C++文件操作(细节满满,part2),C语言疑难,c语言,开发语言

1、功能

从流中读取数据。

2、参数

fscanf和scanf的参数差不多,多了一个文件流stream。

C/C++文件操作(细节满满,part2),C语言疑难,c语言,开发语言

3、 用法

#include<stdio.h>
struct S
{
	float f;
	char ch;
	int n;
};
int main()
{
	struct S s = { 4.14f,'r',1 };
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	//处理
	fscanf(pf, "%f %c %d", &(s.f), &(s.ch), &(s.n));
	printf("%f %c %d", s.f, s.ch, s.n);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

8、fwrite

C/C++文件操作(细节满满,part2),C语言疑难,c语言,开发语言

1、功能

将ptr中的数据写入流中,大小为size,个数为count。

2、参数

ptr:指向要写入文件流中的数据的指针。

size:每个数据的大小。

count:数据个数。

stream:要写入的文件流中。

3、用法

#include<stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "wb");//abcdef
	if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	//处理
	char str[] = "abcd";
	fwrite(str, sizeof(char), sizeof(str) / sizeof(str[0]), pf);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

4、注意 

文件的打开方式要和函数匹配,要用二进制的写的方式

9、fread 

C/C++文件操作(细节满满,part2),C语言疑难,c语言,开发语言

1、功能

从文件流中读取数据。

2、参数

ptr:指向文件流中的数据所要存到的位置的指针。

size:每个数据的大小。

count:数据个数。

stream:文件流。

3、用法

#include<stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "rb");//abcdef
	if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	//处理
	char str[20];
	fread(str, sizeof(char), sizeof(str) / sizeof(str[0]), pf);
	printf("%s", str);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

4、注意 

文件的打开方式要和函数匹配,要用二进制的读的方式

三、文件的随机读写

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

文件指针当前位置
SEEK_SET Beginning of file
SEEK_END Current position of the file pointer
SEEK_CUR End of file

1、fseek

C/C++文件操作(细节满满,part2),C语言疑难,c语言,开发语言 功能是改变文件指针的位置。

#include<stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "r");//abcdef
	if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	//处理
	int ch;
	ch = fgetc(pf);//a
	printf("%c\n", ch);
	ch = fgetc(pf);//b
	printf("%c\n", ch);
	ch = fgetc(pf);//c
	printf("%c\n", ch);
	fseek(pf, -1, SEEK_CUR);
	ch = fgetc(pf);
	printf("%c\n", ch);//c
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

2、ftell 

C/C++文件操作(细节满满,part2),C语言疑难,c语言,开发语言

功能是返回文件当前指针的偏移量。

#include<stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "r");//abcdef
	if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	//处理
	int ch;
	ch = fgetc(pf);//a
	printf("%c\n", ch);
	ch = fgetc(pf);//b
	printf("%c\n", ch);
	ch = fgetc(pf);//c
	printf("%c\n", ch);
	int pos = ftell(pf);
	printf("%d", pos);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

3、rewind 

C/C++文件操作(细节满满,part2),C语言疑难,c语言,开发语言

功能是将文件指针返回起始位置。

#include<stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "r");//abcdef
	if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	//处理
	int ch;
	ch = fgetc(pf);//a
	ch = fgetc(pf);//b
	ch = fgetc(pf);//c
	int pos = ftell(pf);
	printf("%d\n", pos);
	rewind(pf);
	pos = ftell(pf);
	printf("%d", pos);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

四、二进制文件和文本文件

根据数据的存储形式,文件可以分为二进制文件和文本文件。

数据在文件中以二进制存储,就是二进制文件。

数据在文件中以ASCII码值存储,就是文本文件。

五、文件读取结束的标志

在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。

1、文本文件读取结束标志

fgetc——判断是否为EOF

fgets——判断是否为NULL

2、二进制文件读取结束标志

fread——判断返回值是否小于实际要读的个数。

六、文件缓冲区

C/C++文件操作(细节满满,part2),C语言疑难,c语言,开发语言

谢谢大家支持! 文章来源地址https://www.toymoban.com/news/detail-714251.html

到了这里,关于C/C++文件操作(细节满满,part2)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • (Part2)Python编写的计算跳过带有特定数字的车位数量小程序,并利用wxPython做成GUI界面打包成可执行文件

    (Part2)Python编写的计算跳过带有特定数字的车位数量小程序,并利用wxPython做成GUI界面打包成可执行文件

             本文主要讲述利用Python来编写一个可以计算跳过带有特定数字的车位数量小程序。并且又利用第三方库wxPython做出GUI界面,打包成可执行文件。         现实中有这样的实际案例,某楼盘的地下车库的数量有2000多个车位,车位分成了5个分区,每个分区有400-500个

    2024年03月12日
    浏览(13)
  • 集群配置,hadoop配置过程,细节满满

    集群配置,hadoop配置过程,细节满满

    做一个hadoop的配置流程的全记录,把遇到的问题和细节全都记录了下来。 目录 1.安装前准备 jdk,hadoop安装包: 2.开始安装jdk,hadoop 导入安装包 修改jdk,hadoop文件用户所属 配置jdk,hadoop 环境变量,添加对应环境变量 测试安装是否成功  3.hadoop 集群配置文件 core-site.xml hdfs-

    2024年02月05日
    浏览(7)
  • Linux之权限(内容详细,细节满满)

    Linux之权限(内容详细,细节满满)

    个人主页:点我进入主页 专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶 C语言刷题       数据结构初阶    Linux 欢迎大家点赞,评论,收藏。 一起努力 目录 一.前言 二.权限修改的两种方法 2.1利用字符修改 2.1.1Linux中文件的类型

    2024年01月25日
    浏览(7)
  • D47|动态规划-子序列part2

    D47|动态规划-子序列part2

                     左为判断公共子序列,右为判断子序列,感觉代码完全可以套用,如果公共子序列的长度是较短的字符串的长度的话即输出true,如果不是即输出false。         完全不一样的思路,一个新的操纵方法: 编辑距离! 动态规划五部曲: 1)确定dp数组(

    2024年02月02日
    浏览(10)
  • C/C++自定义类型(2)细节满满!

    C/C++自定义类型(2)细节满满!

    该文章的上一篇文章:C/C++自定义类型(1)-CSDN博客 个人主页:仍有未知等待探索_C语言疑难,数据结构,小项目-CSDN博客 专题分栏:C语言疑难_仍有未知等待探索的博客-CSDN博客 目录   一、引言 二、枚举 1、枚举是什么  2、枚举的格式 3、枚举类型的初始化 4、枚举类型中常量

    2024年02月08日
    浏览(6)
  • ChatGPT 教程 - 从入门到精通-part2-完整版

    本教程旨在帮助读者从入门到精通使用 ChatGPT 模型。我们将从基本用法开始,介绍如何创建 ChatGPT 实例、发送文本输入和处理模型输出。然后,我们将探讨如何优化对话流程,包括上下文管理、对话历史追踪、控制生成长度和多样性。接着,我们将深入研究处理特定任务的技

    2024年02月08日
    浏览(9)
  • LaWGPT安装和使用教程的复现版本【细节满满】

    LaWGPT安装和使用教程的复现版本【细节满满】

    LaWGPT 是一系列基于中文法律知识的开源大语言模型。该系列模型在通用中文基座模型(如 Chinese-LLaMA、ChatGLM等)的基础上扩充法律领域专有词表、大规模中文法律语料预训练,增强了大模型在法律领域的基础语义理解能力。LaWGPT是本人尝试使用和微调的第一个法律专业领域的

    2024年01月18日
    浏览(25)
  • 【Linux】进度条小程序——深度解剖(细节满满)

    【Linux】进度条小程序——深度解剖(细节满满)

    ​​​​​ ​ 前言 大家好吖,欢迎来到 YY 滴 Linux系列 ,热烈欢迎! 本章主要内容面向接触过Linux的老铁,主要内容含 欢迎订阅 YY 滴Linux专栏!更多干货持续更新!以下是传送门! 订阅专栏阅读: YY 的《Linux》系列 ❀❀❀❀❀ 【Linux】Linux环境搭建(新手指南,购买,登录)(

    2024年02月14日
    浏览(23)
  • 【UE4 RTS】12-HUD functionality Part2

    【UE4 RTS】12-HUD functionality Part2

    本篇实现了通过按钮控件暂停、加快、减慢游戏速度的功能。 1. 打开控件蓝图“GameTime_HUD”,在设计器中对进度条控件的百分比创建一个绑定函数  绑定函数命名为“Get_ProgressBar_GameSpeed_SetSpeedDisplay”,并设置该函数类别属于GameSpeed    新建一个浮点类型的变量,命名为“

    2024年02月12日
    浏览(11)
  • 深度学习需要掌握的数学知识②【线性代数-part2】

    深度学习需要掌握的数学知识②【线性代数-part2】

    1.克莱姆法则 线性方程组 { a 11 x 1 + a 12 x 2 + ⋯ + a 1 n x n = b 1 a 21 x 1 + a 22 x 2 + ⋯ + a 2 n x n = b 2 ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ a n 1 x 1 + a n 2 x 2 + ⋯ + a n n x n = b n begin{cases} a_{11}x_{1} + a_{12}x_{2} + cdots +a_{1n}x_{n} = b_{1} \\\\ a_{21}x_{1} + a_{22}x_{2} + cdots + a_{2n}x_{n} =b_{2} \\\\ quadcdotscdotscd

    2024年02月16日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包