C语言——小细节和小知识6

一、转义字符相关

\        反斜杠,转义字符中的转义序列符 

\?        将?转义,防止他被识别成三字母词(很早的东西)中的问号

//三字母词
//??(是[
//??)是]
printf("%s","??(??)");
//打印结果是[]

二、fopen函数fclose函数

fopen以及fclose这两个函数都是定义在C语言的stdio.h标准输入/输出头文件中的。

1、fopen

fopen是用于打开文件,可以设置文件的打开方式,如只读,写入,追加等。

在C语言中,我们通过fopen()函数来打开一个文件,并设置相应的操作模式。这三种操作模式,即只读,写入,追加,对应到fopen()函数中的参数,它们分别是"r", "w", "a"。

(1)只读模式("r"):只允许读取文件,不允许写入。如果文件不存在,则打开失败。

FILE *file = fopen("filename", "r");

(2)写入模式("w"):打开文件进行写入。如果文件已存在,其内容会被清空,重新写入新的内容。如果文件不存在,会创建一个新文件。

这个文件会被创建在程序的当前运行目录中。当前运行目录通常是你从命令行启动程序的那个目录。

例如,如果你在命令行中导航到了"C:\Users\YourUsername\Documents\CProjects"目录并从那里运行程序,那么文件 "fprintf.out" 将会被创建在"C:\Users\YourUsername\Documents\CProjects"目录下。

请注意,这可能会根据你的操作系统和编程环境有所不同。在某些环境中,程序的运行目录可能会被设置为其它位置,如程序的二进制文件所在的目录,或者特定的工作目录。在这种情况下,"fprintf.out"文件将会被创建在这些目录之一。

如果你想要将文件创建在特定的位置,你可以在文件名中包含完整的路径,如 "C:\path\to\your\directory\fprintf.out"。

FILE *file = fopen("filename", "w");

(3)追加模式("a"):打开文件进行写入,但是写入的数据会被追加到文件的末尾。如果文件不存在,会创建一个新文件。

在C语言中,fopen函数的打开模式参数"a"代表"append",这是英文单词"追加"的意思。当我们以"append"模式打开一个文件时,所有的写入操作都会在文件的末尾进行,即便在打开文件后我们用fseekrewind改变了文件位置。如果文件不存在,使用"append"模式会创建一个新的文件。这使得我们能在不删除文件现有内容的情况下添加新的数据。

FILE *file = fopen("filename", "a");

在完成文件操作后,别忘了使用fclose()函数来关闭文件,释放系统资源。

fclose(file);

这是一个良好的编程习惯。

file是一个FILE类型的指针变量,用来接收fopen的文件流,后面可以通过fprintf函数进行写入内容。

除了单一的"r"(只读模式)、"w"(写入模式)和"a"(追加模式)之外,还有一些模式是在这些基础上添加了"+"字符,以支持同时进行读写操作,这就是我们所说的组合模式。具体来看:

  • "r+": 以读写模式打开文件。你既可以从文件中读取数据,也可以向文件中写入数据。如果文件不存在,则打开失败。即打开一个已经存在的文件,允许读取和写入。文件指针被设置在文件的开头。
  • "w+": 以读写模式打开文件,如果文件已存在,其内容会被清空。如果文件不存在,会创建一个新文件。即打开一个新文件,或者已存在的文件,允许读取和写入。如果文件已存在,它的内容会被清空。
  • "a+": 以读写模式打开文件,如果文件已存在,写入的数据会被添加到文件的末尾。如果文件不存在,会创建一个新文件。即打开一个已存在的文件,或者新文件,并允许读取和在文件的末尾追加内容。如果文件不存在,会被创建。

2、fclose

fclose()是一个C语言标准库函数,它的作用是关闭已打开的文件。这个函数出现在stdio.h头文件中。关闭文件在处理文件时非常重要,因为它可以帮助释放系统资源,防止数据丢失和其他可能的问题。

fclose()函数的原型如下:

int fclose(FILE *stream);

这里的参数stream是一个文件指针,指向你想要关闭的文件。函数会返回一个整数。如果文件成功关闭,函数会返回零;如果发生错误,函数会返回EOF。

使用fclose()的一个典型例子如下:

FILE *file = fopen("filename", "r");
if (file != NULL) 
{// 在此处进行文件操作.....// 完成后关闭文件if (fclose(file) == 0) {printf("文件已成功关闭.\n");} else {printf("关闭文件时出错.\n");}
}

这段代码尝试打开一个名为"filename"的文件进行读取,如果文件成功打开,它会进行一些文件操作,然后尝试关闭文件。如果文件关闭成功,它会输出“文件已成功关闭”,否则,它会输出“关闭文件时出错”。

三、fprintf函数

1、实际文件的文件流

fprintf这个函数是定义在C语言的stdio.h标准输入/输出头文件中的。

fprintf函数是C语言中的一个标准库函数,用于将格式化的数据输出到指定的文件中。函数名中的"f"代表"file","printf"代表"print formatted",即"向文件打印格式化数据"。

fprintf函数的原型如下:

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

其中:

  • stream:这是一个指向FILE类型的指针,代表要输出数据的文件流。这个文件流通常是由fopen函数打开的。

  • format:这是一个字符串,定义了要输出的数据的格式。这个字符串可以包含一些特殊的格式化符号,比如%d(输出整数)、%f(输出浮点数)、%c(输出字符)和%s(输出字符串),以及其他一些用于控制输出格式的符号。

  • ...:这是一系列可变的参数,这些参数的类型和数量应与格式化字符串中的格式化符号相对应。

fprintf函数会将格式化的数据输出到指定的文件中,然后返回一个整数,表示输出的字符数。如果发生错误,它会返回一个负值。

例如,下面的代码会把一个整数和一个浮点数写入到一个名为"output.txt"的文件中:

FILE *file = fopen("output.txt", "w");if (file != NULL)
{int i = 123;float x = 456.789f;fprintf(file, "Integer: %d, Float: %.2f\n", i, x);fclose(file);
}

这将在文件中生成如下的文本:

Integer: 123, Float: 456.79

在这个例子中,文件output.txt是由fopen函数创建的。在调用fopen函数时使用"w"(write)模式,如果文件不存在,就会创建一个新文件。如果文件已经存在,那么"w"模式会清空文件内容,以便开始新的写入。所以,这段代码执行后,就会在相应的位置生成一个名为output.txt的文件。

这里的:

if (file != NULL)

这个判断是很重要的。当尝试打开一个文件进行读写操作时,如果因为某些原因(例如文件不存在,或者没有足够的权限来访问文件)文件打开失败,fopen 函数会返回 NULL。如果在没有进行这个判断的情况下继续尝试使用这个 NULL 文件指针进行读写操作,将会导致程序出错,甚至可能会使你的程序崩溃。

因此,当我们使用 fopen 函数打开文件后,通常我们会检查返回的文件指针是否为 NULL。如果文件指针为 NULL,我们就知道有一些问题阻止了文件的打开,我们需要处理这个错误,而不是继续进行可能会导致程序崩溃的读写操作。

这是一个良好的编程实践,以确保你的程序在遇到错误时能以恰当的方式来反应,而不是简单地崩溃或产生不确定的行为。

2、其他文件流中

fprintf不止可以输出数据到实际文件的文件流中,也可输出数据到其他文件流中,例如stderr文件流中,在Windows系统中,和其他操作系统一样,stderr(标准错误)并不是一个物理文件,而是一个指向特定设备(通常是显示器)的文件流。当你运行一个程序时,stderr的内容默认会显示在命令行或终端窗口中。

stderr是标准错误输出流的别名,它是C和许多其他编程语言中的一个预定义的文件指针。stdout是标准输出流,通常用于输出程序的结果,而stderr则用于输出错误信息。

#include <stdio.h>int main()
{int dividend = 0;int divisor = 1;scanf("%d %d", &dividend, &divisor);if (divisor == 0){fprintf(stderr,"divisor can not be zero!");}else{double res = dividend * 1.0 / divisor;printf("%lf", res);}return 0;
}

这里只要除数是0,就输出"divisor can not be zero!"这个信息到标准错误输出流中。

四、使文件中内容打印到shell中

system( "type output.out" );:调用系统命令行(shell)来执行 "type output.out" 命令,这个命令在Windows系统中用于在命令行窗口显示文件的内容。

#include <stdio.h>
#include <stdlib.h>int main()
{FILE *file = fopen("output.txt", "w");if (file != NULL)//判断是否为空指针{int i = 123;float x = 456.789f;fprintf(file, "Integer: %d, Float: %.2f\n", i, x);fclose(file);}system("type output.txt");return 0;
}

如果在使用C语言的fopenfclose函数和system函数共同操作一个文件,那么应该在fclose之后使用system函数。

fopenfclose函数用于打开和关闭文件流。当你使用fopen函数打开一个文件时,这个文件就会被锁定,防止其它的应用或进程同时访问。如果在fclose之前使用system函数尝试访问这个文件,可能会因为文件被锁定而无法访问。

因此,建议在关闭文件流,即在fclose函数调用之后,再使用system函数。这样可以确保system函数能够正常访问和操作文件。

需要注意的是,system函数需要在已经设置好PATH的环境中运行,并且它的效率相对较低,因为它需要创建一个子进程并加载shell来执行命令。在安全性要求较高的场合,也应该尽量避免使用system函数,以防止命令注入攻击。

五、fscanf函数

对于fopen的三个模式,其中有两个是用于fprintf的,即"w"写入和"a"追加模式,两种模式都可以用fprintf向这个文件写入数据;另外一个模式,即"r"只读模式是用于fscanf的,可以用fscanf函数读出文件中的数据。

fscanf函数是C语言标准库中的一个函数,用于从文件流中读取格式化输入。它的原型如下:

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

其中:

  • stream是要读取的文件流,通常是使用fopen函数打开的。
  • format是一个格式字符串,定义了要读取的数据的类型和顺序。例如,"%d %s %f"会读取一个整数,一个字符串和一个浮点数。
  • ...是要读取数据的变量的指针,数量和顺序应与format参数中的转换说明符相对应。

函数成功返回时返回成功读取的项数。如果到达文件末尾或发生读取错误,它将返回EOF

以下是使用fscanf的一个例子:

#include <stdio.h>int main()
{FILE* file = fopen("read.txt", "r");if (file == NULL){printf("无法打开文件\n");return 1;}int i;float f;while (fscanf(file, "%d %f", &i, &f) == 2){printf("读取到的数据: %d %f\n", i, f);}fclose(file);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/240456.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue2+Vue3组件间通信方式汇总(2)------$emit

组件间通信方式是前端必不可少的知识点&#xff0c;前端开发经常会遇到组件间通信的情况&#xff0c;而且也是前端开发面试常问的知识点之一。接下来开始组件间通信方式第二弹------$emit,并讲讲分别在Vue2、Vue3中的表现。 Vue2Vue3组件间通信方式汇总&#xff08;1&#xff0…

【C++】STL 容器 - stack 堆栈容器 ① ( stack 堆栈容器特点 | stack 堆栈容器与 deque 双端数组容器对比 | 简单示例 )

文章目录 一、 stack 堆栈容器简介1、stack 堆栈容器引入2、stack 堆栈容器特点3、stack 堆栈容器与 deque 双端数组容器对比 二、 代码示例 - stack 堆栈容器简单示例1、代码示例2、执行结果 一、 stack 堆栈容器简介 1、stack 堆栈容器引入 C 语言中的 STL 标准模板库 中的 s…

ABS210-ASEMI手机适配器整流桥ABS210

编辑&#xff1a;ll ABS210-ASEMI手机适配器整流桥ABS210 型号&#xff1a;ABS210 品牌&#xff1a;ASEMI 封装&#xff1a;ABS-4 特性&#xff1a;贴片、整流桥 最大平均正向电流&#xff1a;2A 最大重复峰值反向电压&#xff1a;1000V 恢复时间&#xff1a;&#xff…

步兵 cocos2dx 加密和混淆

文章目录 摘要引言正文代码加密具体步骤代码加密具体步骤测试和配置阶段IPA 重签名操作步骤 总结参考资料 摘要 本篇博客介绍了针对 iOS 应用中的 Lua 代码进行加密和混淆的相关技术。通过对 Lua 代码进行加密处理&#xff0c;可以确保应用代码的安全性&#xff0c;同时提高性…

Xcode15 iOS 17 Simulator 离线安装,模拟器安装

Xcode 15 安装包的大小相比之前更小&#xff0c;因为除了 macOS 的 Components&#xff0c;其他都需要动态下载安装&#xff0c;否则提示 iOS 17 Simulator Not Installed。 如果不安装对应的运行模拟库 无法真机和模拟器运行&#xff0c;更无法新建项目。但是由于模拟器安装包…

Jenkins 插件管理指南

目录 常用插件 插件安装 已安装插件 installed plugins 常用插件 Docker Plugin&#xff1a; 这个插件让Jenkins能够与Docker容器平台进行集成。它允许在Jenkins构建过程中创建、管理和销毁Docker容器&#xff0c;为需要Docker化的项目提供了极大的便利性。对于需要在容器中…

反序列化漏洞原理、成因、危害、攻击、防护、修复方法

反序列化漏洞是一种安全漏洞&#xff0c;它允许攻击者将恶意代码注入到应用程序中。这种漏洞通常发生在应用程序从不安全的来源反序列化数据时。当应用程序反序列化数据时&#xff0c;它将数据从一种格式&#xff08;例如JSON或XML&#xff09;转换为另一种格式&#xff08;例如…

Redis原理

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…

广州华锐互动:VR元宇宙技术为汽车行业带来革命性变化

随着科技的飞速发展&#xff0c;VR元宇宙技术已经深入影响到我们生活的方方面面&#xff0c;汽车行业更是深受其益。这一新兴技术的出现&#xff0c;为汽车行业带来了前所未有的变化。广州华锐互动将VR技术应用于汽车行业&#xff0c;研发了VR汽修培训、3D汽车展厅、特种车辆3D…

【NI-RIO入门】理解Windows、Real Time与FPGA之间数据通信的原理

于NI kb摘录 1.概述 对于NI RIO系列设备&#xff08;CompactRIO、sbRIO、myRIO等&#xff09;进行编程时&#xff0c;需要注意有三个不同的组件。 人机界面 (HMI) 。有时称为“主机”&#xff0c;为用户提供图形用户界面&#xff08;GUI&#xff09;&#xff0c;用于监控系统…

若依vue如何展示一个HTML页面(或者展示Markdown文档)

一. 前言 ⚠ 本文是展示Markdown的方法,不能直接前端编辑Markdown文档. 二. 准备部分 用Typora编辑器打开需要导出html页面,我这里使用Typora来导出 1. 先将md文件导出成html 2. 将导出好的文件放在若依vue的pubilc下(文件可以是中文) 三. 代码部分 1.使用v-html来展示HT…

【ubuntu 22.04】安装中文版系统、中文语言包和中文输入法

在系统安装中的键盘布局选择时&#xff0c;选择Chinese - Chinese&#xff0c;此时会自动安装所有的中文语言包和ibus中文输入法系统安装成功重启后&#xff0c;点击设置 - 区域和语言 - 管理已安装的语言 * 根据提示安装更新后&#xff0c;将汉语&#xff08;中国&#xff09;…

HarmonyOS构建第一个ArkTS应用(Stage模型)

构建第一个ArkTS应用&#xff08;Stage模型&#xff09; 创建ArkTS工程 若首次打开DevEco Studio&#xff0c;请点击Create Project创建工程。如果已经打开了一个工程&#xff0c;请在菜单栏选择File > New > Create Project来创建一个新工程。 选择Application应用开发…

数据库编程大赛:一条SQL计算扑克牌24点

你是否在寻找一个平台&#xff0c;能让你展示你的SQL技能&#xff0c;与同行们一较高下&#xff1f;你是否渴望在实战中提升你的SQL水平&#xff0c;开阔你的技术视野&#xff1f;如果你对这些都感兴趣&#xff0c;那么本次由NineData主办的《数据库编程大赛》&#xff0c;将是…

14 款最佳文件恢复软件 [2024 年最佳精选工具]

顶级文件恢复软件的综合列表和比较。阅读此详细评论以选择最佳文件恢复工具并轻松恢复您的文件&#xff1a; 您在选择文件恢复工具时遇到困难吗&#xff1f;在阅读了对十大文件恢复软件的评论后&#xff0c;您可以做出正确的决定。 数据丢失是一个严重的问题&#xff0c;会损…

Leetcode—1491.去掉最低工资和最高工资后的工资平均值【简单】

2023每日刷题&#xff08;六十八&#xff09; Leetcode—1491.去掉最低工资和最高工资后的工资平均值 实现代码 class Solution { public:double average(vector<int>& salary) {double sum 0;int n salary.size();sort(salary.begin(), salary.end());for(int i…

【Amazon 实验②】使用缓存策略及源请求策略,用于控制边缘缓存的行为及回源行为

文章目录 1. 了解缓存策略和源请求策略1.1 使用缓存键和缓存策略 实验&#xff1a;使用CloudFront缓存策略和缓存键控制缓存行为 接上一篇文章【Amazon 实验①】使用 Amazon CloudFront加速Web内容分发&#xff0c;我们现在了解和配置如何使用缓存策略及源请求策略&#xff0c;…

IP技术在网络安全防护中的重要意义

随着互联网的普及&#xff0c;网络安全问题日益凸显。作为网络通信中的重要标识&#xff0c;IP地址在网络安全防护中扮演着关键角色。近日&#xff0c;一则关于IP技术在网络安全防护措施的新闻引起了广泛关注。 据报道&#xff0c;IP技术已成为网络安全防护的重要手段之一。通过…

C++核心编程(一)

C核心编程 1. 内存分区模型 代码区&#xff1a;存放函数的二进制代码&#xff0c;由操作系统进行管理全局区&#xff1a;存放全局变量和静态变量以及常量栈区&#xff1a;由编译器自动分配释放&#xff0c;存放函数的参数值&#xff0c;局部变量等堆区&#xff1a;由程序员分…

第11章 GUI Page423~424 步骤六 支持文字,使用菜单,对话框输入文字

运行效果&#xff1a; 点击OK&#xff0c;然后再窗口上按住左键&#xff0c;拖动鼠标 关键代码&#xff1a; 新增头文件和成员&#xff0c;新增私有成员_text 成员初始化 为菜单项MenuItemText添加响应函数 新增创建TextItem()的代码