day15

calloc函数也可以动态分配内存
这个函数可以把动态分配的所有存储区内容
   清0
为了使用这个函数也需要包含stdlib.h头文件
这个函数需要两个参数,第一个参数表示
    希望分配的存储区个数,第二个参数
    表示单个存储区的大小
这个函数的返回值表示分配好的第一个存储区
   的地址
这个函数也可能失败,如果失败则返回值是NULL

realloc函数可以调整一段动态分配内存的
    大小
一般不要使用这个函数

文件都是采用二进制方式记录数字
如果文件里所有二进制数据都有对应的字符
    就把这种文件叫做文本文件
除了文本文件以外的文件都叫做二进制文件

文本文件和二进制文件分别采用不同的方式
   进行操作(文本文件也可以当作二进制文件
    进行操作)

文件操作基本步骤
1.打开文件(fopen)
2.操作文件(fread/fwrite)
3.关闭文件(fclose)

fopen函数用来打开文件,它需要两个参数
1.代表文件路径
2.代表打开方式(决定可以在程序中对文件
    进行什么操作)

打开方式有如下选择
"r"      只能察看文件内容不能修改
         只能从文件头开始察看
         如果文件不存在打开会失败
"r+"     比"r"多了修改功能
"w"      只能修改文件内容不能察看
         只能从文件头开始修改
         如果文件不存在就创建文件
         如果文件已经存在就把文件内容
             都删除
"w+"     比"w"多了察看文件内容的功能
"a"      只能修改不能察看
         修改方式是在文件原有内容后面追加
            新内容
         如果文件不存在就创建文件
         如果文件已经存在不会修改文件
            原有内容
"a+"     比"a"多了察看功能

"b"也是一种打开方式
它可以和前面的任何一种打开方式混合使用
它表示程序中要以二进制方式操作文件

fopen函数的返回值应该记录在文件指针里,
    程序中只能用文件指针代表文件
fopen函数有可能失败,如果失败就返回NULL

一旦完成对文件的所有操作以后必须使用fclose
    函数关闭文件
fclose函数需要文件指针作为参数
文件关闭以后文件指针成为野指针,必须恢复
    成空指针

文件操作分成两种
1.把内存里一组连续存储区的内容拷贝到
    文件里,这个叫写文件(fwrite)
2.把文件里一组连续存储区的内容拷贝到
    内存里,这个叫读文件(fread)

fread和fwrite都是以二进制方式操作文件的

这两个函数都需要四个参数
1.内存里第一个存储区的地址
2.内存里单个存储区的大小
3.希望操作的存储区个数
4.文件指针

这两个函数都有返回值,它们的返回值表示实际
    操作的存储区个数

fprintf函数可以把数据按照格式记录到文本
    文件里
这个函数的第一个参数是一个文件指针,后面
    的参数和printf函数的参数一样
这个函数以文本方式操作文件

fscanf函数可以从文本文件里获得数字并记录
    到存储区里
这个函数的第一个参数是一个文件指针,后面
    的参数就是scanf函数的参数
这个函数也是以文本方式操作文件

计算机里为每个文件保留了一个整数,
    这个整数表示下一次读写文件的开始位置
这个位置一定在两个相邻的字节之间
这个整数的数值就是文件头到这个位置之间
    包含的字节个数
这个整数叫做文件的位置指针
每次从文件中读n个字节或向文件里写n个字节
    后位置指针都会向后移动n个字节

ftell函数可以获得当前位置指针的数值

rewind函数可以把位置指针的数值设置成0

fseek函数可以把位置指针放到文件中的任何
    位置
在fseek函数里需要设置一个基准位置以及
   目标位置到基准位置的距离

SEEK_SET    0    把文件头作为基准位置
SEEK_CUR    1    把当前位置作为基准位置
SEEK_END    2    把文件尾作为基准位置

如果目标位置在基准位置后边则距离用非负数
    表示
如果目标位置在基准位置前边则距离用负数表示

距离的数值就是目标位置和基准位置之间包含
    的字节个数
### 黑马 Java Day 15 课程资料与教程 #### 一、多线程编程基础 在黑马程序员Java培训的第15天,重点讲解了多线程的基础概念及其创建方式。Java中的线程是程序执行流的最小单位,在现代操作系统中可以并发运行多个线程来提高效率[^4]。 对于线程的创建有两种主要方法:继承`Thread`类重写其`run()`方法;实现`Runnable`接口同样需要定义该方法并由外部传入到`Thread`实例中启动新线程。这两种方式各有优劣,前者更直观但可能造成单继承局限性;后者则更加灵活适用于资源共享场景[^4]。 ```java // 继承 Thread 类的方式 class MyThread extends Thread { public void run() { System.out.println("This is a thread by extending Thread class."); } } // 实现 Runnable 接口的方式 class MyRunnable implements Runnable { @Override public void run() { System.out.println("This is a thread by implementing Runnable interface."); } } ``` #### 二、线程同步机制 当涉及到共享资源访问时,为了防止数据竞争条件的发生,引入了锁的概念用于控制同一时刻只有一个线程能够操作特定区域内的代码——即所谓的临界区。可以通过`synchronized`关键字修饰方法或语句块达到此目的[^4]。 ```java public synchronized void criticalSectionMethod(){ // 只有一个线程能进入这段代码 } ``` 或者使用显式的对象监视器: ```java Object lock = new Object(); synchronize(lock){ // 同步代码块 } ``` #### 三、高级特性介绍 除了基本的操作外,还探讨了一些更为复杂的主题如守护进程(daemon threads),它们通常作为服务提供者存在而不参与应用程序的主要逻辑流程;以及如何通过`join()`函数等待其他线程完成工作后再继续执行当前线程的任务等实用技巧[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值