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语言】文件操作scanf,fscanf,sscanf(第二弹) -> 正文阅读

[C++知识库]【C语言】文件操作scanf,fscanf,sscanf(第二弹)

上次【C语言】文件操作超细的!(第一弹)_tt142的博客-CSDN博客

已经简单的介绍了文件的相关知识,下面具体来讲一下函数

目录

1.printf,fprintf,sprintf

2.scanf,fscanf,sscanf

1.printf,fprintf,sprintf

printf是我们很熟悉的函数,他是把数据打印到屏幕上,针对的是标准输出流

fprintf,针对文件,对于所有输出流都适用,把数据格式化之后输出到文件里

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{

	FILE* p = fopen("text.txt", "r");
	if (p == NULL)
	{
		return 1;
	}
	
	int ch=fgetc(p);
	if (ch!= EOF)
	{
		//putchar(ch);
		printf("%c\n", ch);
	}
	fclose(p);
	p = NULL;

	return 0;
}

int main()
{
	int a = 2;
	printf("%d\n", a);


	FILE*p=fopen("text.txt", "w");
	if (p == NULL)
	{
		return 1;
	}
	char arr[] = "abc";
	if (1==fprintf(p, "%s", arr))
	{
		printf("success\n");
	}
	else
	{
		if (feof(p))
		{
			printf("end\n");
		}
		else if(ferror(p))
		{
			printf("in\n");
		}
	}

	fclose(p);
	p = NULL;

	return 0;
}

我们会看到

?

?

注意在写fprintf的时候,这个函数是有返回值

?

如果成功写入,会返回写入的总数量,我们这里写进了一个字符串

?补充:

在判断返回值是否为1的时候,我们写了函数feof

注意:feof不能直接判断是否到文件末,而是当文件结束的时候到底是因为文件末还是异常结束!

所以对于fgetc这样的读取失败返回文件末的函数,应该用feof判断一下返回值是否为EOF

?

int main()
{

	FILE* p = fopen("text.txt", "r");
	if (p == NULL)
	{
		return 1;
	}
	
	int ch=fgetc(p);
	if (ch!= EOF)
	{
		//putchar(ch);
		printf("%c\n", ch);
	}
	fclose(p);
	p = NULL;

	return 0;
}

而fgets

如果遇到文件末尾,会返回EOF,此时应该用feof判断

如果在一开始就读到end-of-file,后面还有可读的字符,那文件指针会被置空,并且没读到的字符不会被改变(显然),如果读取过程中就遇到了错误,那么用ferror(专门判断在读取过程中遇到错误的函数),文件指针依旧会被置空,但是此时这个指针指到的字符就会被改变!!

我们知道,文件指针起始指向第一个字符,每读取一次就会自动后移一个位置?

?

sprintf,针对字符串,也只适用于字符串,把数据格式化之后输出到字符串里

int main()
{
	FILE* p = fopen("text.txt", "w");
	if (p == NULL)
	{
		return 1;
	}
	fprintf(p, "%s", "abc");
	fclose(p);
	p = NULL;

	 p = fopen("text.txt", "r");

	char ans[5];
	sprintf(ans,"%c%c",fgetc(p), fgetc(p));

	fclose(p);
	p = NULL;

	return 0;
}

2.scanf,fscanf,sscanf

和上三个函数差不多

scanf,键盘的数据输入到键盘缓冲区,函数从缓冲区拿数据

fsacnf,从文件缓冲区中拿数据,格式化,输入到指定类型的变量中

sscanf,从字符串中拿数据,格式化,输入到指定类型的变量

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

	char ch[6]={0};
	fscanf(p, "%c", &ch[0]);
	printf("%c", ch[0]);

    char arr[6]={0};
	sscanf(&ch[0], "%c", &arr[0]);
	printf("%c\n", arr[0]);


	fclose(p);
	p = NULL;

	return 0;
}

文件缓冲区

我们前面说的fscanf和fprintf不是直接从文件里读数据到变量,或者写入文件,而是所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。

从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。

如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。

缓冲区的大小根据C编译系统决定的。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-10-17 12:13:43  更:2022-10-17 12:15:18 
 
开发: 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 8:18:29-

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