2022.10.19《VR引擎程序设计基础》—学习笔记整理(二)

166 阅读4分钟

一、大文件读取方式

1.FileStream文件流(操作字节可以读取各种文件信息)

(1)FileStream文件流和File的区别

头文件的引入代码:

 `using System.Text;
  using System.IO;`
  

File在读取文件的时候是一次性读取所有的文件信息,而FileStream是以文件流的形式一点点去读取文件的信息

(2)使用FileStream读取文件

image.png

(3)使用FileStream写入文件信息

image.png

2.StreamReader和StreamWrite读写文本文件(读取字符信息)

1.StreamReader

image.png

2.StreamWriter

image.png 小练习:写一个程序逐行输入字符串,将每一行的内容写入到同个目录下的1.txt文件并换行,最后遇到q字符结束写入 (思考注意点: 如果这里文件不加后缀名.txt则会导致计算机将其识别为文件夹,且写入的方式是以覆盖的形式进行写入的,之前的数据会被覆盖掉)

image.png 注:

  • 使用FileStream可以读取所有的文件,包括图片,音频等等,写法比较麻烦。
  • 读取大文件的非图片或音频信息,我们就可以使用StreamReader,StreamWriter(读取到的是字符串)

扩展:

读取文件夹下的所有文件

二、字符串类String

1.关于字符串的几个方法

image.png

image.png

2.使用StringBuilder创建字符串

1.为什么要使用StringBuilder

如果我们频繁去删除和添加字符串中的内容,使用string生成的字符串我们知道每次更改会重新指向堆中新的数据,这样会重复删除新建数据非常耗性能,

思考:StringBuilder不会频繁申请内存空间,可以自动向后扩展,说白了就是一种创建字符串的高性能手段。

2.StringBuilder创建字符串的方式

image.png

Console.WriteLine(str1.Length) //获取字符串的长度并打印
Console.WriteLine(str2.Capacity)//获取字符串的容量并打印

补充: 当小于16的时候基本容量是16,如果大于16那就扩展和字符串的长度一致。 这里的Append追加指的是在字符串的末尾添加追加的内容。

三、正则表达式

1.正则表达式有什么用?

1.1、标准解释: image.png 1.2、课堂理解:

1、 识别字符串是否满足对应的表达式。(判定

2、 识别出指定的字符串,然后进行替换。(替换

1.3、难点:

如何书写正则表达式 正则表达式由很多元字符组成,实际上还是一个字符串。

注: [a-z]代表的是a-z的任意一个字符,

2.正则表达式是什么?

正则表达式其实就是由普通字符以及特殊字符(元字符)组成的文字模式,该模式描述在查找文字主体时待匹配的一个或多个字符串。

3.各种元字符(重难点)

(1)字符类

[ char_group]:匹配**字符组中**的任意一个字符

[^char_group]:匹配**除字符组之外**的任意一个字符

[first-last]:匹配从first到last的字符范围中的任意一个字符,字符范围包括first和last。

.一个点:通配符,匹配除\n之外的任意一个字符

\w:匹配任意一个单词(word)字符,单词字符通常是指A-Z、a-z和0-9

\W:匹配任意一个非单词字符,是指除A-Z、a-z和0-9之外的字符 注意:如果再加一个/,取消原字符的作用。

\s:匹配任意一个空白字符

\S:匹配任意一个非空白字符

\d:匹配任意一个数字字符

\D:匹配任意一个非数字字符
复制代码

(2)定位类

^:默认情况下,匹配字符串的开始位置;在多行模式下,匹配每行的开始位置;
**举例1:**  @"^1$"表示1开头,1结尾,符合条件输出:true 反之 false
**举例2:**  @"^1{3,5}$  输入:sjadsadhsad111afsaffs 结果:true

$:默认情况下,匹配字符串的结束位置,或 字符串结尾的\n之前的位置;在多行模式下,匹配每行结束之前的位置,或者每行结尾的\n之前的位置。

\A:匹配字符串的开始位置;

\Z:匹配字符串的结束位置,或 字符串结尾的\n之前的位置;

\z:匹配字符串的结束位置;

\G:匹配上一个匹配结束的位置;

\b:匹配一个单词的开始或结束的位置;

\B:匹配一个单词的中间位置;
复制代码

(3)量词、贪婪和懒惰

*:规定前面字符出现0次或多次

+:出现1次或多次

?:出现0次或1次

{n}:出现n次
举例:@"(真好){3}"   真好倘若出现>=3次  输出true  反之false

{n,}:出现至少n次

{n,m}:出现n到m次

x|y x或者y中的一个字符

3.Regex.Replace()方法替换匹配出来的字符串

image.png

4.Regex.IsMatch(字符串,正则表达式)判断字符串是否符合正则表达式

image.png

5.匹配是否是正确的邮箱

课堂练习:

例:识别qq邮箱 4到11位的数字 开头不能是0 结尾为@qq.com

    string qqmail = @"^[1-9]\d{3,10}(@qq.com)$";
    string str = Convert.ToString(Console.ReadLine());
    Console.WriteLine(Regex.IsMatch(str, qqmail));

邮箱的格式是qq号(5~12位数字)+@qq.com

image.png

6.Regex.Match(s,pattern)匹配第一个满足的字符串

image.png

7.Regex.Matches(s,pattern)匹配所有满足的字符串并返回出来

image.png

8.常见的几个正则表达式

image.png

9 例题1.常见的几个正则表达式日期格式的匹配正则表达式问题:年份:0000到2999 月份1到12 日期1到31

       string date =@"(^[0-2]|[0-9]{3})-([0][1-9]|[1][0-2])-([0][1,9]|[1-2][0-9]|[3][01])$" ;
    while (true)
    {
        //返回所有的子串 Matches
        string str = Console.ReadLine();
       Console.WriteLine(Regex.IsMatch(str, date));

    }

10 例题2

使用学到的文件操作,创建三个文件文件名分别是数学.txt,语文.txt,英语.txt,里面分别存放着50个学生的数学,语文,英语成绩,每一行放着名字和对应的分数,名字是小明1,小明2这样的规律显示,分数随机,每一行显示的完整内容是 科目+名字+分数,接下来用我们前面讲到的正则表达式,找出所有txt文件中的小明1的成绩逐行显示到1.txt文件中

代码总体逻辑的梳理: 代码总体思路:流写入(for循环遍历、随机数的生成)、关闭文件→文件内容读取(正则表达式定义和判定)→文件的再次写入

    //找出三个文档中的小明1成绩,并将其进行拼接到新的文件当中。
 
    StreamWriter math = new StreamWriter("./数学.txt");
    StreamWriter language = new StreamWriter("./语文.txt");
    StreamWriter english = new StreamWriter("./英语.txt");
    Random score = new Random();
 
    for (int i = 1;i <= 50;i++) {
        string nscore = score.Next(0, 101).ToString();
        math.WriteLine("数学成绩:" + "小明" + i + " "+   nscore);
        language.WriteLine("语文成绩:" + "小明" + i + " " +  nscore);
        english.WriteLine("英语成绩:" + "小明" + i + " " +  nscore);
    }
    math.Close();//一定要有此选项,否则会导致写入失败,但是代码程序不会报错;  
    language.Close();
    english.Close();

    //找出三个文档中的小明1成绩,并将其进行拼接到新的文件当中。
    StreamReader Rmath = new StreamReader("./数学.txt");
    StreamReader Rlanguage = new StreamReader("./语文.txt");
    StreamReader Renglish = new StreamReader("./英语.txt");

    string math1 = Rmath.ReadLine();
    string language1 = Rlanguage.ReadLine();
    string english1 = Renglish.ReadLine();

    string pattern = @"小明1";
    StreamWriter grade = new StreamWriter("./1.txt");
    if (Regex.IsMatch(math1,pattern) ) {
        grade.WriteLine(math1);
    }
    if (Regex.IsMatch(language1, pattern))
    {
        grade.WriteLine(language1);
    }
    if (Regex.IsMatch(english1, pattern))
    {
        grade.WriteLine(english1);
    }
    grade.Close();
    代码总体思路:流写入(for循环遍历、随机数的生成)、关闭文件→文件内容读取(正则表达式定义和判定)→文件的再次写入
    StreamReader Rmath = new StreamReader("./数学.txt");
    StreamReader Rlanguage = new StreamReader("./语文.txt");
    StreamReader Renglish = new StreamReader("./英语.txt");

    string math1 = Rmath.ReadLine();
    string language1 = Rlanguage.ReadLine();
    string english1 = Renglish.ReadLine();

    string pattern = @"小明1";
    StreamWriter grade = new StreamWriter("./1.txt");
    if (Regex.IsMatch(math1,pattern) ) {
        grade.WriteLine(math1);
    }
    if (Regex.IsMatch(language1, pattern))
    {
        grade.WriteLine(language1);
    }
    if (Regex.IsMatch(english1, pattern))
    {
        grade.WriteLine(english1);
    }
    grade.Close();

10 例题3

请利用面向对象分析实现图书管理系统,具有录入,查询 ,删除,显示所有图书信息功能。借助文件操作的方式存储数据,将书籍存放到图书文件夹下,每本书都是一个txt文件,文件名为该书的名字,书中的初始内容为书名,图书的数据有书名,作者,价格,删除的时候要输入书的名字来进行删除。

该项目的一个思考

  • 信息存在的话不要添加需要使用if语句实现一个过滤操作
  • 查询、增加、删该都要注意使用if语句的判断,使系统逻辑设计的更加严谨
  • 方法函数用类进行封装
  • 交互的东西不要写在函数里面
  • $用于字符串的拼接代替传统的➕实现拼接

image.png