C语言第三十六弹---文件操作(中)

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

C语言第三十六弹---文件操作(中),C语言详解,c语言,开发语言,算法

个人主页: 熬夜学编程的小林

💗系列专栏: 【C语言详解】 【数据结构详解】

文件操作

1、文件的顺序读写

1.1、顺序读写函数介绍

1.1.1、fgetc 与 fputc

1.1.2、fgets 与 fputs

1.1.3、fscanf 与 fprintf

1.1.4、fread 与 fwrite

1.2、对比一组函数

总结


1、文件的顺序读写

1.1、顺序读写函数介绍

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

上面说的适用于所有输入流⼀般指适用于标准输入流和其他输入流(如文件输入流)所有输出流⼀般指适用于标准输出流和其他输出流(如文件输出流)

1.1.1、fgetc 与 fputc

C语言第三十六弹---文件操作(中),C语言详解,c语言,开发语言,算法

int fputc ( int character, FILE * stream );

将字符写入流。
将字符写入流并推进位置指示器。

字符被写在流的内部位置指示器指示的位置,然后自动前进一个。

举个例子:

#include <stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "w");
	//文件操作
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//将字符写入文件
	fputc('a', pf);
	fputc('b', pf);
	fputc('c', pf);
	fputc('d', pf);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

VS执行此代码之后不会输出内容,需要去找到对应文件验证。 

C语言第三十六弹---文件操作(中),C语言详解,c语言,开发语言,算法

int fgetc ( FILE * stream );

从流中获取字符。
返回指定流的内部文件位置指示器当前指向的字符。然后,内部文件位置指示器将前进到下一个字符。

如果流在调用时位于文件末尾,则该函数将返回 EOF 并设置流的文件末尾指示符 (feof)。

如果发生读取错误,该函数将返回 EOF 并设置流的错误指示器 (ferror)。

fgetc 和 getc 是等效的,只是 getc 在某些库中可以作为宏实现。

举个例子:

#include <stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "r");
	//文件操作
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
    //从pf流中读取数据
	int ch = fgetc(pf);
	printf("%c ", ch);

	ch = fgetc(pf);
	printf("%c ", ch);

	ch = fgetc(pf);
	printf("%c ", ch);

	ch = fgetc(pf);
	printf("%c ", ch);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

输出结果与对应文件内容比较如下图:

C语言第三十六弹---文件操作(中),C语言详解,c语言,开发语言,算法

1.1.2、fgets 与 fputs

C语言第三十六弹---文件操作(中),C语言详解,c语言,开发语言,算法

int fputs ( const char * str, FILE * stream );

将字符串写入流。
将 str 指向的 C 字符串写入流。

该函数从指定的地址 (str) 开始复制,直到到达终止 null 字符 ('0')。此终止 null 字符不会复制到流中。

请注意,fputs 与 puts 的不同之处不仅在于可以指定目标流,而且 fputs 不会写入其他字符,而 puts 会自动在末尾附加换行符。

举个例子:

#include <stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("test1.txt", "w");
	//文件操作
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//将字符串写入文件
	fputs("abcdef", pf);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

执行该代码之后的文件结果如下图: 

C语言第三十六弹---文件操作(中),C语言详解,c语言,开发语言,算法

char * fgets ( char * str, int num, FILE * stream );
//str为接受数据的地址

从流中获取字符串。
从流中读取字符,并将它们作为 C 字符串存储到 str 中,直到读取 (num-1) 个字符或到达换行符或文件末尾,以先到者为准。

换行符使 fgets 停止读取,但它被函数视为有效字符,并包含在复制到 str 的字符串中。

终止 null 字符会自动追加到复制到 str 的字符之后。

请注意,fgets 与 gets 有很大不同:fgets 不仅接受 stream 参数,还允许指定 str 的最大大小,并在字符串中包含任何结束换行符。

#include <stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("test1.txt", "r");
	//文件操作
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	char arr[100] = { 0 };
	//将文件中读取字符串
	fgets(arr, 5, pf);
	printf("%s\n", arr);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

测试结果如下图: 

C语言第三十六弹---文件操作(中),C语言详解,c语言,开发语言,算法

1.1.3、fscanf 与 fprintf

C语言第三十六弹---文件操作(中),C语言详解,c语言,开发语言,算法

int fprintf ( FILE * stream, const char * format, ... );

将格式化的数据写入流。
将按格式指向的 C 字符串写入流。如果 format 包含格式说明符(以 % 开头的子序列),则格式后面的附加参数将被格式化并插入到生成的字符串中,以替换它们各自的说明符。

在 format 参数之后,该函数至少需要与 format 指定的其他参数一样多的附加参数。

举个例子:

#include <stdio.h>
struct S
{
	float f;
	char c;
	int n;
};
int main()
{
	struct S s = { 5.2f,'c',52 };//结构体初始化
	//打开文件
	FILE* pf = fopen("test1.txt", "w");
	//文件操作
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	fprintf(pf, "%f-%c-%d", s.f, s.c, s.n);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

代码测试:

C语言第三十六弹---文件操作(中),C语言详解,c语言,开发语言,算法

int fscanf ( FILE * stream, const char * format, ... );

从流中读取格式化的数据。
从流中读取数据,并根据参数格式将数据存储到其他参数所指向的位置。

附加参数应指向已分配的对象,该对象由格式字符串中的相应格式说明符指定。

举个例子:

#include <stdio.h>
struct S
{
	float f;
	char c;
	int n;
};
int main()
{
	struct S s = { 0 };
	//打开文件
	FILE* pf = fopen("test1.txt", "r");
	//文件操作
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读文件
	fscanf(pf, "%f-%c-%d", &(s.f), &(s.c), &(s.n));
	printf("%f-%c-%d\n", s.f, s.c, s.n);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

测试代码: 

C语言第三十六弹---文件操作(中),C语言详解,c语言,开发语言,算法

1.1.4、fread 与 fwrite

C语言第三十六弹---文件操作(中),C语言详解,c语言,开发语言,算法

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

将数据块写入流中。
从 ptr 指向的内存块写入一个 count 元素数组,每个元素的大小为 Bytes 字节。

流的位置指示器按写入的总字节数前进。

在内部,该函数将 ptr 指向的块解释为无符号字符类型的 (size*count) 元素数组,并按顺序将它们写入流式处理,就好像为每个字节调用了 fputc 一样。

举个例子:

#include <stdio.h>
int main()
{
	int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
	//打开文件
	FILE* pf = fopen("data.txt", "wb");
	//文件操作
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
    //二进制写文件
	fwrite(arr, sizeof(arr[0]), sizeof(arr) / sizeof(arr[0]), pf);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

测试代码: 

C语言第三十六弹---文件操作(中),C语言详解,c语言,开发语言,算法

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

从流中读取数据块。
从流中读取 count 元素的数组,每个元素的大小为 bytes,并将它们存储在 ptr 指定的内存块中。

流的位置指示器按读取的总字节数前进。

如果成功,读取的总字节数为 (size*count)。

举个例子:

#include <stdio.h>
int main()
{
	int arr[10] = { 0 };
	//打开文件
	FILE* pf = fopen("data.txt", "rb");
	//文件操作
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//二进制写文件
	fread(arr, sizeof(arr[0]), sizeof(arr) / sizeof(arr[0]), pf);
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

测试代码: 

C语言第三十六弹---文件操作(中),C语言详解,c语言,开发语言,算法

1.2、对比一组函数


scanf / fscanf / sscanf

                int scanf ( const char * format, ... );
//使用键盘输入信息
int fscanf ( FILE * stream, const char * format, ... );
//将stream中的信息写入后面格式化函数中
int sscanf ( const char* s, const char * format, ... );
//将字符串信息转化为格式化信息


printf / fprintf / sprintf

                int printf ( const char * format, ... );
//打印信息到屏幕
int fprintf ( FILE * stream, const char * format, ... );
//将后面格式化信息写到stream中
int sprintf ( char * str,    const char * format, ... );
//将格式化数据转化为字符串数据

总结


本篇博客就结束啦,谢谢大家的观看,如果公主少年们有好的建议可以留言喔,谢谢大家啦!文章来源地址https://www.toymoban.com/news/detail-838356.html

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

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

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

相关文章

  • ROS学习第三十六节——Gazebo仿真环境搭建

    1.1加入环境模型 在工程文件中创建worlds文件夹,并把之前下载的box_house.world文件放入  1.2编写launch文件 deamo03_car_world.launch 2.1启动 Gazebo 并添加组件 2.2保存仿真环境 添加完毕后,选择 file --- Save World as 选择保存路径(功能包下: worlds 目录),文件名自定义,后缀名设置为 .worl

    2023年04月24日
    浏览(36)
  • 第三十六讲:神州无线AP胖AP模式配置与管理

          胖AP(Fat AP)配置一个开放式WLAN非常方便,需要完成的操作包括有线和无线两部分的配置。有线部分即ethernet接口的配置,保证AP能够接入Internet,无线部分的配置包括关联WLAN与VLAN,广播SSID,启用VAP,若无其他DHCP服务器的话,AP还需要启用DHCP为无线客户下发IP地址。 配置要

    2024年02月05日
    浏览(45)
  • ChatGPT 与生成式 AI 的崛起:第二十六章到第三十三章

    原文:Rise of Generative AI and ChatGPT 译者:飞龙 协议:CC BY-NC-SA 4.0 恐怖分子、罪犯、警察、国防、执法机构、工程师、作家和学生等都在使用 ChatGPT,这是来自 OpenAI 的强大自然语言人工智能工具,作为他们日常工作的重要组成部分。自去年 11 月底发布以来,这种生成式人工智

    2024年01月24日
    浏览(255)
  • 爬虫工作量由小到大的思维转变---<第三十六章 Scrapy 关于CrawlSpider引发的议题>

    因为scrapy-redis里面有两个spider,一个basespider,一个crawlspider;有人分不清他们的区别;本文就来掰一掰他们的事; `CrawlSpider` 和 `Spider` 是两个不同的爬虫类,具有以下区别: 1. `Spider` 类:`Spider` 是 Scrapy 中最基本的爬虫类。你可以从 `scrapy.Spider` 类派生出自定义的爬虫类。在基本的

    2024年02月03日
    浏览(33)
  • 【前端知识】React 基础巩固(三十六)——RTK中的异步操作

    引入RTK中的createAsyncThunk,在extraReducers中监听执行状态 在界面中引入所需的异步操作Action 查看运行结果 extraReducer还可以传入一个函数,函数接受一个builder参数: 查看运行结果,与之前的写法结果一致

    2024年02月15日
    浏览(48)
  • C++第十六弹---string使用(上)

    ✨ 个人主页:   熬夜学编程的小林 💗 系列专栏:   【C语言详解】   【数据结构详解】 【C++详解】 目录 1、标准库中的string类    1.1、string类的常用接口说明 1.1.1、string类对象的常见构造 1.1.2、string类对象的容量操作  1.1.3、string类对象的访问及遍历操作 总结 根据前面一

    2024年04月12日
    浏览(28)
  • C语言(第三十二天)

    1. 递归是什么? 递归是学习C语言函数绕不开的一个话题,那什么是递归呢? 递归其实是一种解决问题的方法,在C语言中,递归就是函数自己调用自己。 写一个史上最简单的C语言递归代码: 上述就是一个简单的递归程序,只不过上面的递归只是为了演示递归的基本形式,不

    2024年02月11日
    浏览(30)
  • C语言(第三十五天)

    3. 移位操作符 左移操作符 右移操作符 注:移位操作符的操作数只能是整数。 3.1 左移操作符 移位规则:左边抛弃、右边补0 3.2 右移操作符 移位规则:首先右移运算分两种: 1. 逻辑右移:左边用0填充,右边丢弃 2. 算术右移:左边用原该值的符号位填充,右边丢弃 警告⚠️

    2024年02月10日
    浏览(39)
  • C语言第三十九弹---预处理(上)

    ✨ 个人主页:   熬夜学编程的小林 💗 系列专栏:   【C语言详解】   【数据结构详解】 预处理 1、预定义符号 2、#define定义常量 3、#define定义宏 4、带有副作用的宏参数 5、宏替换的规则 6、宏和函数的对比 总结 在C语言中,预处理阶段是代码执行之前的一个重要步骤,负

    2024年04月09日
    浏览(38)
  • 第三十三章:RPA与自然语言处理的安全保障

    RPA(Robotic Process Automation)和自然语言处理(NLP)是两种不同的技术领域,但它们在现实生活中的应用中有很多相互关联和相互影响的地方。在这篇文章中,我们将讨论RPA与自然语言处理的安全保障,以及如何在实际应用中保障数据安全和系统安全。 自然语言处理(NLP)是一种通过计

    2024年02月22日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包