B4X编程语言:B4X文件操作(File对象的使用)

news2024/12/19 21:21:11

        大部分应用程序都离不开文件内容或数据的物理读写操作,这就需要我们经常访问持久性存储(物理存储)。最常见的两种存储类型是文件和数据库,本章节主要讲述关于文件的操作方法(部分翻译自B4X语言手册)。
        B4X提供了一个操作文件的File对象,可以用于文件的创建、删除、复制、读写等操作,它包含了许多用于处理文件的函数。
        要进行文件操作,首先必须掌握文件存放位置的概念(B4X中,B4A、B4i、B4J不同平台的文件位置有所不同),其次我们还要掌握文件名称的命名规则、File对象的常用方法等。

        一、文件位置

        1、File.DirAssets (通用)

        该文件夹在B4A、B4i、B4J中位置相同,都是项目文件夹中的Files文件夹,包含IDE中文件管理器添加的文件。
        这些文件是只读的!您不能在此文件夹中创建新文件(在B4A中它实际上位于apk文件中)。
        如果您在该文件夹有一个数据库文件,您需要将它复制到另一个文件夹后才能使用它。
        例如:
        SQLDataPath=xui.DefaultFolder
        SQLDateName="mydb.db"
        If File.Exists(SQLDataPath,SQLDateName)=False Then
                File.Copy(File.DirAssets,SQLDateName,SQLDataPath,SQLDateName)
        End If
#If B4J
        SQL1.InitializeSQLite(SQLDataPath,SQLDateName,True)
#Else
        SQL1.Initialize(SQLDataPath, SQLDateName, True)
#End If

        2、XUI.DefaultFolder (跨平台、通用)

        要保存由应用程序生成的且仅由应用程序使用的数据,您最好使用XUI(jXUI或iXUI)库来获取默认文件夹。因为XUI是跨平台的。
        XUI.DefaultFolder
        此文件夹与下面文件夹相同:
        B4A - File.DirInternal
        B4i  - File.DirDocuments
        B4J  - File.DirData

        在使用此文件夹之前,您必须首先调用SetDataFolder 一次。
        XUI.SetDataFolder(AppName As String)
        其中:AppName是应用程序名称。

        3、仅B4A使用的文件位置
        ① File.DirInternal / File.DirInternalCache 

        这两个文件夹存储在设备的主内存中,并且是应用程序的私有文件夹。其他应用程序无法访问这些文件。如果需要更多的空间,缓存文件夹可能会被操作系统删除。

        ② File.DirRootExternal 

        存储卡的根文件夹。 在大多数情况下,这是一个内部存储卡,而不是一个外部SD卡。
        只有在您真正需要时,才能使用此文件夹。

        ③ File.DirDefaultExternal

        SD卡中应用程序的默认文件夹。
        文件夹是: <storage card>/Android/data/<package>/files/
        package是应用程序的包名称。
        如果需要,可以创建它。

        注意:
        调用上述两个属性中的任何一个都会将EXTERNAL_STORATGE权限添加到应用程序。
        提示:你可以检查是否有一个存储卡,以及它是否外部可读(File.ExternalReadable),是否外部可写(File.ExternalWritable)。

        ④ External storage (外部存储)

        您应该使用运行时权限库(RuntimePermissions)来获得最佳的文件夹:
        MyFolder = RuntimePermissions.GetSafeDirDefaultExternal(SubFolder As String)
       返回辅助存储设备上应用程序的默认文件夹的路径。如果没有可用的辅助存储器,则返回File.DirInternal路径。它是比File.DirDefaultExternal更好的方法。

        在安卓4.4+上,访问此文件夹不需要任何权限。
        SubFolder:将为您的应用程序创建的一个子文件夹。如果不需要,请传递一个空字符串。

        在 Android 中,访问外部存储设备中的文件变得很麻烦。
        Erel 编写了一个 ExternalStorage类 以简化访问 SD 卡和 USB 设备。下面的关于该类的使用方法摘自 Erel 的线程:
        在我们开始之前需要先了解:
        (1) 外部存储是指真正的 SD 卡或连接的大容量存储 USB 设备。
        (2) 它与 File.DirRootExternal / DirDefaultExternal 无关,后者实际上指向内部存储。
        (3) 它与运行时权限无关。
        (4) 您可以使用 RuntimePermissions.GetAllSafeDirsExternal 直接访问 SD 卡上的特定文件夹。
        (5) 此类的最低版本为 Android 5。它可能适用于 Android 4.4(如果您想尝试,请更改 minSdkVersion)。

        从Android 4.4开始,就再也不能直接访问外部存储了。访问这些存储的唯一方法是通过存储访问框架(SAF),这是一个相当复杂且文档记录不足的框架。
        ExternalStorage类使访问SAF更加简单。

        用法:
        (1) 调用ExternalStorage.SelectDir. 这将打开一个对话框,它允许用户选择根文件夹。 一旦选择,根文件夹的uri将被存储,以后可以使用,即使设备重启也不需要用户再次选择文件夹。
        (2) 等待ExternalFolderAvailable 事件。现在您可以访问存储器根目录下的文件及子文件夹。
        (3) 文件被表示为一个名为ExternalFile的自定义类型。
        (4) 系统支持以下操作: 文件列表,删除,创建新文件,查找文件,打开输入流和输出流。

        依赖项:ContentResolver 和 JavaObject 库。
        使用时在应用程序主模块头添加:
        #AdditionalJar: com.android.support:support-core-utils

        4、仅B4i使用的文件位置
        ① File.DirDocuments

        文档文件夹仅用于存储用户生成的内容。可以通过 iTunes 共享此文件夹。
        此文件夹由 iTunes 自动备份。

        ② File.DirLibrary

        任何非用户生成的持久文件的位置。此文件夹由 iTunes 自动备份。
        您可以创建一个名为 Caches 的子文件夹。该文件夹下的文件将不会被备份。

        ③ File.DirTemp

        临时文件夹。此文件夹中的文件不会由 iTunes 备份,可能会不时被删除。

        5、仅B4J使用的文件位置
        ① File.DirApp

        返回应用程序文件夹。
        在Windows中,应用程序一般安装在Program Files下,因为Program Files下的文件夹是只读的。 因此File.DirApp也是只读的。

        ② File.DirData

        返回适合写入文件的文件夹的路径。
        此方法在非windows电脑上返回与File.DirApp相同的路径。
        在Windows上,它返回用户数据文件夹的路径。例如:
        C:\Users\[username]\AppData\Roaming\[AppName]

        ③ File.DirTemp

        返回临时文件夹。

        二、B4X文件名

        B4X文件名允许使用以下字符:
        A - z, A Z, 0 9 , 点., 下划线以及+ - % &和空格。
        字符*?是不允许的。
        例如: MyFile.txt

        请注意,B4X文件名是区分大小写的!
        MyFile.txt和myFile.txt是不同的文件。

        三、File对象常用方法

        1、File.Exists ( Dir As String, FileName As String)

        检查文件是否已存在,如果文件存在则返回 True,如果不存在则返回 False。
        Dir:要检查的文件位置,如:File.DirData、XUI.DefaultFolder等。
        FileName:要检查的文件名称。
        注意:File.Exists 不适用于 File.DirAssets !!!

        2、File.OpenOutput (Dir As String, FileName As String, Append As Boolean)

        打开给定的文件进行输出,Append参数指定是否在现有文件的末尾添加文本。如果该文件不存在,它会被创建。

        3、File.OpenInput (Dir As String, FileName As String)

        打开文件进行读取。

        4、File.WriteString (Dir As String, FileName As String, Text As String)

        将给定的文本写入到一个新的文件中。

        5、File.ReadString (Dir As String, FileName As String) As String

        读取一个文件,并以字符串的形式返回其内容。

        6、File.WriteList (Dir As String, FileName As String, List As List)

        将列表中存储的所有值写入文件。如果需要,所有值都会转换为字符串类型。每个值都将存储在单独的行中。
        请注意,如果值包含换行符,它将保存在多行中,当您读取它时,将按多行读取。

        7、File.ReadList (Dir As String, FileName As String) As List

        读取文件并将每行存储为列表中的项。

        8、File.WriteMap (Dir As String, FileName As String, Map As Map)

        获取一个键和值元素对的映射对象并将其存储在文本文件中。文件格式为 Java 属性文件.properties
        文件格式不是太重要,除非文件被手动编辑。这种格式使手动编辑变得很容易。
        File.WriteMap 的一个常见用途是将“设置”映射保存到文件中。

        9、File.ReadMap (Dir As String, FileName As String) As Map

        读取属性文件并将其键/值对作为 Map 对象返回。请注意,返回的条目顺序可能与原始顺序不同。

        10、File.WriteBytes (Dir As String, FileName As String, Data As Byte())

        将给定的文本写入新文件。

        11、File.ReadBytes (Dir As String, FileName As String)

        从给定的文件中读取数据。返回: Byte()。

        12、File.Copy (DirSource As String, FileSource As String, DirTarget As String, FileTarget As String)

        将源文件从源文件夹复制到目标文件夹中的目标文件。
        DirSource:源文件夹。如:File.DirAssets
        FileSource:源文件名称。
        DirTarget:目标文件夹。如:File.DirApp
        FileTarget:目标文件名称。
        请注意,无法将文件复制到 Assets 文件夹。

        13、File.Copy2 (In As InputStream, Out As OutputStream)

        将输入流中的所有可用数据复制到输出流。
        输入流在结束时自动关闭。

        14、File.Delete (Dir As String, FileName As String)

        从给定文件夹删除给定文件。

        15、File.ListFiles (Dir As String) As List

        列出指定文件夹Dir中的文件和子文件夹。
        示例:
        Private List1 As List
        List1 = File.ListFiles(File.DirInternal)
        List1 可以在 Sub Globals 中声明

        16、File.Size (Dir As String, FileName As String)

        返回指定文件的大小(以字节为单位)。
        此方法不支持资源文件夹File.DirAssets中的文件。

        17、File.MakeDir (Parent As String, Dir)

        创建给定文件夹(根据需要创建任何文件夹)。
        示例:
        File.MakeDir(File.DirInternal, "music/90")

        四、创建和访问子文件夹

        B4X和其它语言的文件夹操作略有不同,无论是创建和访问子文件夹还是读写文件,其File方法都需要两个参数:Dir As String、FileName As String。其中:Dir是由诸如File.DirAssets、File.DirData、File.DirInternal、xui.DefaultFolder等方法指定的文件夹,FileName是子文件夹名称或包含子文件夹字符串的文件名称。
        例如:Dim a As Int=File.Size(File.DirData("PreTest"),"test/test1/Style.css")
        如果不这样做,我们还得多加一条语句:
        Dim s As String=$"${File.DirData("PreTest")}/test/test1/"$
         Dim a As Int=File.Size(s,"Style.css")

        在B4X中新建子文件夹语法:
        File.MakeDir (Parent As String, Dir)
        其中:Parent是由File方法指定的父文件夹名称。
        Dir是要创建的文件夹名称(可以包含子文件夹)。

        例如:
        If File.Exists(File.DirData("PreTest"),"test/test1")=False Then
                File.MakeDir(File.DirData("PreTest"),"test/test1")
        End If

        要访问子文件夹,您需要将子文件夹名添加到其父文件夹名后,中间用 / 隔开。或者在文件名前添加子文件夹名称,中间用 / 隔开。两种方法都可行。例如:
        Dim b() As Byte
        b = File.ReadBytes(File.DirData("PreTest"),"test/test1/Style.css")
        或b = File.ReadBytes(File.DirData("PreTest")&"/test/test1/","Style.css")

        五、文本读写对象:TextReader 和 TextWriter

        B4X提供了两个有用的对象:TextReader 和 TextWriter,用于文本文件的读写。

        (一) TextReader方法
        1、TextReader.Initialize (InputStream As InputStream)

        将 TextReader 初始化为输入流。
        例如:
        Private Reader As TextReader
        Private In1 As InputStream
        In1=File.OpenInput(File.DirData("PreTest"), "test/test1/Style.txt")
        Reader.Initialize(In1)
        Reader 可以在 Sub Globals 中声明。

        2、TextReader.Initialize2 (InputStream As InputStream, Encoding As String)

        将 TextReader 初始化为输入流。
        Encoding 表示 CodePage(也称为 CharacterSet),即文本编码。
        例如:
        Private Reader As TextReader
        Private In1 As InputStream
        In1=File.OpenInput(File.DirData("PreTest"), "test/test1/Style.txt")
        Reader.Initialize2(In1,"UTF-8")

        3、TextReader.ReadAll As String

        读取所有剩余文本并关闭流。
        示例:txt = Reader.ReadAll

        4、TextReader.ReadLine As String

        从流中读取下一行。
        不返回换行符。
        如果没有更多字符可读取,则返回 Null。

        示例:
        Private Reader As TextReader
        Private In1 As InputStream
        In1=File.OpenInput(File.DirData("PreTest"), "test/test1/Style.txt")
        Reader.Initialize2(In1,"UTF-8")
        Private line As String
        line = Reader.ReadLine
        Do While line <> Null
                Log(line)
                line = Reader.ReadLine
        Loop
        Reader.Close

        5、TextReader.ReadList As List

        读取剩余文本并返回一个由行填充的 List 对象。
        完成后关闭流。
        示例:List1 = Reader.ReadList

        6、TextReader.Close

        关闭流。

        (二) TextWriter方法
        1、TextWriter.Initialize (OutputStream As OutputStream)

        将 TextWriter 对象初始化为输出流。
        示例:
        Private Writer As TextWriter
        Private out1 As OutputStream
        out1=File.OpenOutput(File.DirData("PreTest"),"test/test1/Style1.txt",False)
        Writer.Initialize(out1)

        2、TextWriter.Initialize2 (OutputStream As OutputStream , Encoding As String)

        将 TextWriter 对象初始化为输出流。
        Encoding 表示文本编码的 CodePage(也称为 CharacterSet)

        示例:
        Private Writer As TextWriter
        Private out1 As OutputStream
        out1=File.OpenOutput(File.DirData("PreTest"),"test/test1/Style1.txt",False)
        Writer.Initialize2(out1,"UTF-8")

        3、TextWriter.Write (Text As String)

        将给定的文本写入流。

        4、TextWriter.WriteLine (Text As String)

        将给定的文本写入流,后跟换行符 LF Chr(10)。

        5、TextWriter.WriteList (List As List)

        将列表中的每个列表项作为一行写入。
        请注意,包含 CRLF 的值将保存为两行(使用 ReadList 读取时将返回两个项)。
        所有值都将转换为字符串。

        6、TextWriter.Close

        关闭流。

        六、文本编码

        文本编码或字符编码由将给定库中的每个字符与其他字符配对的代码组成。其他术语,如字符集 (charset),有时还有字符映射或代码页,几乎可以互换使用(来源 Wikipedia)。
        在Windows中,最常见的字符集是ASCII和ANSI。
        •  ASCII包括128个字符的定义,其中33个是非打印控制字符(现在大部分已经过时),它们会影响文本和空格的处理方式。
        •  ANSI,Windows- 1252或CP- 1252是拉丁字母表的一个字符编码,在微软Windows的传统组件的英语和其他一些西方语言中默认使用,有256个定义(一个字节)。前128个字符与ASCII编码中的相同。
        许多由Windows程序生成的文件都是用西方语言中的ANSI字符集进行编码的。例如: Excel csv文件、默认的记事本文件。但记事本文件可以用UTF-8编码来保存。

        B4X可以使用以下字符集:
        •   UTF-8                 默认字符集
        •   UTF - 16
        •   UTF - 16 BE
        •   UTF - LE
        •   US-ASCII              ASCII字符集
        •   ISO-8859- 1           几乎相当于ANSI字符集
        •   Windows- 1251         西里尔字符
        •   Windows- 1252         拉丁字母表

        要读取用ANSI编码的Windows文件,您应该使用Windows-1252字符集。如果您需要编写文件用于Windows,那么您还应该使用Windows-1252字符集。

        Windows和B4X的另一个区别是行的末尾字符:
        •   B4X,仅在行的末尾添加LF(换行符)字符Chr(10)。
        •   Windows, 在一行的末尾添加两个字符CR(回车符Chr(13))和LF (换行符Chr(10))。如果您需要为Windows编写文件,您必须自己添加CR。
        行结尾的符号为:
        •   B4X                       CRLF              Chr( 10)
        •   Basic4PPC           CRLF              Chr(13) & Chr(10)

        要用不同的编码来读写文件,您必须使用以Initialize2方法初始化的TextReader 或 TextWriter 对象。读取csv文件也一样。

        关于读取Excel csv文件的提示:
        您可以:
        •   在桌面上,用诸如NotePad 或 Notepad++等文本编辑器加载csv文件
        •    使用UTF-8编码保存文件

        Notepad++ 使用不带BOM的UTF-8编码。
        或者
        •   使用TextReader.Initialize2 和 "Windows- 1252" 编码阅读整个文件。
        •   使用标准的Android编码,用TextWriter.Initialize把它保存回来。
        •   从StringUtils库中用LoadCSV或LoadCSV2读取文件。

        Private txt As String
        Private tr As TextReader
        tr.Initialize2(File.OpenInput(File.DirAssets,"TestCSV1_W.csv"),"Windows-1252")
         txt = tr.ReadAll
        tr.Close
        Private tw As TextWriter
        tw.Initialize(File.OpenOutput(File.DirInternal,"TestCSV1_W.csv", False))
         tw.Write(txt)
        tw.Close
        lstTest = StrUtil.LoadCSV2(File.DirInternal, "TestCSV1_W.csv", ";", lstHead)

        当您使用NotePad保存文件时,将额外添加三个字节,这些字节被称为BOM字符(字节顺序标记)。
        在UTF-8中,它们由这个字节序列表示:0xEF、0xBB、0xBF。
        文本编辑器或web浏览器将文本解释为Windows-1252字符时将显示字符。
        为了避免这种情况,您可以使用Notepad++ 而不是NotePad,并使用不带BOM的UTF-8。

        将文本从Windows-1252更改为UTF-8的另一种方法是使用下面的代码。
        Private var, result As String
        var = "Gestió"
        Private arrByte() As Byte
        arrByte = var.GetBytes("Windows-1252")
        result = BytesToString(arrByte, 0, arrByte.Length, "UTF8")

        七、注意事项

        1、文本文件的输入流InputStream和输出流OutputStream主要由两个用处:一是用于TextReader 和 TextWriter的文本读写,一是用于File.Copy2流复制。输入流和输出流在使用前需先通过File.OpenInput、File.OpenOutput打开流,使用后关闭。
        2、根据Erel的建议,除非是非 UTF8 文件或大文件,文本读写一般不使用TextReader 和 TextWriter,而是使用File的 ReadString / WriteStringReadList / WriteList、ReadBytes / WriteBytes方法。
        
3、要将文件添加到您的项目中,您必须在 IDE 中的“文件”选项卡中添加这些文件。这些文件将添加到项目“Files”文件夹中。

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

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

相关文章

spring\strust\springboot\isp前后端那些事儿

后端 一. 插入\更新一条数据&#xff08;老&#xff09; Map<String, Object> parameterMap MybatisUtil.initParameterSave("Send_ProjectFrozenLog", sendProjectFrozenLog); commonMapper.insert(parameterMap);parameterMap MybatisUtil.initParameter…

UE5安装Fab插件

今天才知道原来Fab也有类似Quixel Bridge的插件&#xff0c;于是立马就安装上了&#xff0c;这里分享一下安装方法 在Epic客户端 - 库 - Fab Library 搜索 Fab 即可安装Fab插件 然后重启引擎&#xff0c;在插件面板勾选即可 然后在窗口这就有了 引擎左下角也会多出一个Fab图标…

对于使用exe4j打包,出现“NoClassDefFoundError: BOOT-INF/classes”的解决方案

jar使用exe4j打包exe&#xff0c;出现NoClassDefFoundError: BOOT-INF/classes 注意选取的jar包是使用build&#xff0c;而不是maven中的install 本文介绍解决这个方法的方案 点击Project Structure 按照如图所示选择 选择main class&#xff0c;选择你要打的main 如果遇到/M…

文件上传之文件内容检测

一.基本概念 介绍&#xff1a;文件内容检测就是检测上传的文件里的内容。 文件幻数检测 通常情况下&#xff0c;通过判断前10个字节&#xff0c;基本就能判断出一个文件的真实类型。 文件加载检测 一般是调用API或函数对文件进行加载测试。常见的是图像渲染测试&#xff0c;再…

WebSpoon9.0(KETTLE的WEB版本)编译 + tomcatdocker部署 + 远程调试教程

前言 Kettle简介 Kettle是一款国外开源的ETL工具&#xff0c;纯Java编写&#xff0c;可以在Window、Linux、Unix上运行&#xff0c;绿色无需安装&#xff0c;数据抽取高效稳定 WebSpoon是Kettle的Web版本&#xff0c;由Kettle社区维护&#xff0c;不受Pentaho支持&#xff0c;…

搭建Tomcat(三)---重写service方法

目录 引入 一、在Java中创建一个新的空项目&#xff08;初步搭建&#xff09; 问题&#xff1a; 要求在tomcat软件包下的MyTomcat类中编写main文件&#xff0c;实现在MyTomcat中扫描myweb软件包中的所有Java文件&#xff0c;并返回“WebServlet(url"myFirst")”中…

CAN配置---波特率中断引脚等---autochips-AC7811-ARM-M3内核

1、配置工具 虽然不怎么好用&#xff0c;但比没有强多了。具体看图&#xff1a; 时钟选着 NVIC配置 GPIO配置 2、生成的具体配置信息 NXP的配置工具里面&#xff0c;具体的波特率可以直接显示&#xff0c;这个工具没有&#xff0c;怎么办&#xff1f; 它放到了生成的代码里面…

matlab Patten的使用(重要)(Matlab处理字符串一)

原文连接&#xff1a;https://www.mathworks.com/help/releases/R2022b/matlab/ref/pattern.html?browserF1help 能使用的搜索函数&#xff1a; contains确定字符串中是否有模式matches确定模式是否与字符串匹配count计算字符串中模式的出现次数endsWith确定字符串是否以模式…

Docker创建一个mongodb实例,并用springboot连接 mongodb进行读写文件

一、通过Docker 进行运行一个 mongodb实例 1、拉取镜像 docker pull mongo:5.0.5 2、创建 mongodb容器实例 docker run -d --name mongodb2 \-e MONGO_INITDB_ROOT_USERNAMEsalaryMongo \-e MONGO_INITDB_ROOT_PASSWORD123456 \-p 27017:27017 \mongo:5.0.5 3、进入容器&am…

#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍02-基于错误消息的SQL注入(Error-Based SQL Injection)

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

OpenCVE:一款自动收集NVD、MITRE等多源知名漏洞库的开源工具,累计收录CVE 27万+

漏洞库在企业中扮演着至关重要的角色&#xff0c;不仅提升了企业的安全防护能力&#xff0c;还支持了安全决策、合规性要求的满足以及智能化管理的发展。前期博文《业界十大知名权威安全漏洞库介绍》介绍了主流漏洞库&#xff0c;今天给大家介绍一款集成了多款漏洞库的开源漏洞…

Spring Boot 3.X:Unable to connect to Redis错误记录

一.背景 最近在搭建一个新项目&#xff0c;本着有新用新的原则&#xff0c;项目选择到了jdk17SpringBoot3.4。但是在测试Redis连接的时候却遇到了以下问题&#xff1a; redis连不上了。于是我先去检查了配置文件的连接信息&#xff0c;发现没问题&#xff1b;再去检查配置类&am…

MinT: 第一个能够生成顺序事件并控制其时间戳的文本转视频模型。

MinT 是第一个能够生成顺序事件并控制其时间戳的文本转视频模型。使用 MinT 生成时间控制的多事件视频。给定一系列事件文本提示及其所需的开始和结束时间戳&#xff0c;MinT 可以合成具有一致主题和背景的平滑连接事件。此外&#xff0c;它可以灵活地控制每个事件的时间跨度。…

C语言实验 结构体2

时间:2024.12.18 6-5 评委打分-t-CalcuScore 代码 // 定义结构体 struct Score {int id;char name[10];int value[17];double finalScore;int rank; };// 计算最终成绩 void CalcuScore(struct Score grade[], int n) {for (int i = 0; i < n; i++) {int max = grade[i].…

第6章 第一组重构

最常用到的重构就是用提炼函数&#xff08;106&#xff09;将代码提炼到函数中&#xff0c;或者用提炼变量&#xff08;119&#xff09;来提炼变量。既然重构的作用就是应对变化&#xff0c;你应该不会感到惊讶&#xff0c;我也经常使用这两个重构的反向重构——内联函数&#…

基于python对网页进行爬虫简单教程

python对网页进行爬虫 基于BeautifulSoup的爬虫—源码 """ 基于BeautifulSoup的爬虫### 一、BeautifulSoup简介1. Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱&#xff0c;通过解析文档为用户提供需要…

C语言中文件是什么?文件文本和二进制文件的区别

1、C语言中文件是什么&#xff1f; 我们对文件的概念已经非常熟悉了&#xff0c;比如常见的 Word 文档、txt 文件、源文件等。文件是数据源的一种&#xff0c;最主要的作用是保存数据。 在操作系统中&#xff0c;为了统一对各种硬件的操作&#xff0c;简化接口&#xff0c;不同…

vmware workstation pro上创建虚拟机

vmware workstation pro上创建虚拟机 下载vmware workstation pro软件安装后并运行点击主页&#xff0c;选择创建虚拟机 创建虚拟机成功后会出现如下界面 可以点击设置按钮删除不需要的硬件&#xff0c;也可以添加新的硬件设备&#xff0c;最终硬件信息如下图 至此虚拟机…

【数学建模】利用Matlab绘图(2)

一、Matlab中plot函数的基本用法 在matlab中&#xff0c;函数的基本用法主要包括以下几种 第一类&#xff1a; plot(X,Y,LineSpec) 第二类&#xff1a; plot(tbl,xvar,yvar) 1.1 第一类 1.1.1x-y坐标 x和y的选择取决于绘图所需的数据类型以及图像的类型。下表列出了几种…

ASP.NET Core - 依赖注入 自动批量注入

依赖注入配置变形 随着业务的增长&#xff0c;我们项目工作中的类型、服务越来越多&#xff0c;而每一个服务的依赖注入关系都需要在入口文件通过Service.Add{}方法去进行注册&#xff0c;这将是非常麻烦的&#xff0c;入口文件需要频繁改动&#xff0c;而且代码组织管理也会变…