LINUX学习——LINUX文件结构

Q1:什么是Linux文件系统?

文件系统指文件存在的物理空间,Linux系统中每个分区都是一个文件系统,都有自己的目录层次结构,Linux会将这些分属不同分区的,单独的文件系统按一定的方式形成一个系统的总的目录层次结构。

(1)主要包括两方面内容:一是文件本身所包含的数据;二是文件的属性。
(2)目录也是一种文件,称为目录文件,内容是该目录的目录项,目录项是该目录下的文件和目录的相关信息。
(3)标准目录结构——树形结构

Q2:Linux目录结构的组成

(1)根文件系统
(2)/usr目录结构
(3)/var目录结构

Q3:常见文件类型和linux文件属性

通过”ls-l”可以查看文件类型和属性
– 普通文件;
d 目录文件;
l 链接文件;
c 字符设备;
b 块设备;
p 管道文件;
f 堆栈文件;

Q4:系统调用

所谓系统调用,就是指操作系统提供用户调用一组“特殊”的接口,用户程序可以通过这组“特殊”的接口来获得操作系统内核提供的服务。

(1)系统调用函数通常在成功时返回0值,不成功时返回非零值。
(2)许多系统的调用的返回数据通常引用参数传递,需要在函数参数中传递缓冲区地址,而返回的数据就保存在该缓冲区中。
(3)内核模式和用户模式分别使用自己的堆栈。运行空间也分为内核空间和用户空间,它们分别运行在不同的级别上,在逻辑上相隔离。

Q5:不带缓存的I/O操作

(1)creat函数:用于建立文件
(2)open函数:用于打开文件
(3)read函数:用于从已打开的文件读取数据
(4)close函数:用于关闭文件
(5)write函数:用于将数据写入已打开的文件内
(6)lseek函数:用于移动文件的读写位置

Q6:带缓存的I/O操作

标准I/O提供了三种类型的缓冲

1.1全缓冲:填满标准I/0缓冲区才进行实际的操作。
1.2行缓冲:当输入和输出中遇到换行符,标准I/O库执行I/O操作。
1.3不带缓冲:标准I/O库不对字符进行缓冲存储。
2.fopen函数:用于打开文件
3.flocse函数:用于关闭函数
4.fdopen:用于将文件描述词转为文件指针
5.fread函数:用于从文件流读取数据
6.fwrite函数:用于将数据写至文件流
7.fssek函数:用于移动文件流的读写位置

Q7:fgetc、get、getchar

1.fgetc函数

(1)函数说明:用于从文件中读取一个字符;若读到文件尾而无数据时便返回EOF
(2)返回值:读取到的字符:若返回EOF则表示到了文件尾

2.getc函数:用于从文件中读取一个字符

函数说明和返回值与fgetc()一样,但是getc()为宏定义,非真正的函数调用。

3.getchar函数

(1)函数说明:用来从标准输入设备中读取一个字符;然后将该字符从unsigned char 转换为 int 后返回
(2)返回值:返回读取到的字符;若返回EOF则表示有错误发生
getchar()非真正函数,而是getc(stdin)宏定义

Q8:fputc、putc、putchar

1.fputc函数:

(1)函数说明:将参数c转为unsigned char后写入参数stream指定的文件里
(2)返回值:返回写入成功的字符,即参数c;若返回EOF则代表写入失败

2.put函数:

函数说明和返回值与fputc()一样,但put()为宏定义,非真正的函数调用

3.putchar函数:

(1)函数说明:将参数c写到标准输出设备
(2)返回值:返回写入成功的字符,即参数c;若返回EOF则代表写入失败
putchar()并非真正函数,而是putc(c,stdout)宏定义

Q9:fgets函数与gets函数比较分析:

1.fgets函数:

(1)函数原型:char *fgets(char *buf, int bufsize, FILE *stream);

  参数:

  *buf: 字符型指针,指向将存储到的数据地址。

  bufsize: 整型数据,指明buf指向的字符数组的大小。

  *stream: 文件结构体指针,将要读取的文件流。
(2)函数说明:从文件结构体指针stream中读取数据,每次读取一行。读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋’\0’),如果文件中的该行,不足bufsize个字符,则读完该行就结束。
(3)返回值:如果函数读取成功,则返回指针buf,失败则返回NULL。
  如果使用fgets()读取某个文件,第一次读取的bufsize为5,而文件的第一行有10个字符(算上’\n’),那么读取文件的指针会偏移至当前读取完的这个字符之后的位置。也就是第二次再用fgets()读取文件的时候,则会继续读取其后的字符。而,如果使用fgets() 读取文件的时候bufsize大于该行的字符总数加2(多出来的两个,一个保存文件本身的’\n’换行,一个保存字符串本身的结束标识’\0’),文件并不会继续读下去,仅仅只是这一行读取完,随后指向文件的指针会自动偏移至下一行。
例:

  如果一个文件的当前位置的文本如下

  Love, I Have

  Since you can do it.

  如果用fgets(str1,6,file1);去读取

  则执行后str1 = “Love,” ,读取了6-1=5个字符

  这个时候再执行fgets(str1,20,file1)则执行后str1 = ” I Have\n”

  而如果

  fgets(str1,23,file1);

  则执行str1=”Love ,I Have”,读取了一行(包括行尾的’\n’,并自动加上字符串结束符’\0’),当前文件位置移至下一行,虽然23大于当前行上字符总和,可是不会继续到下一行。而下一次调用fgets()继续读取的时候是从下一行开始读。

2.gets函数:

头文件:stdio.h(c),cstdio(c++)

(1)原型:char*gets(char*);
(2)函数说明:从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为NUL值,并由此来结束字符串。
(3)返回值:读入成功,返回与参数buffer相同的指针;读入过程中遇到EOF(End-of-File)或发生错误,返回NULL指针。所以在遇到返回值为NULL的情况,要用ferror或feof函数检查是发生错误还是遇到EOF。
(4)注意事项:本函数可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。

Q9:输出

1.printf函数:用于格式化输出数据
2.fprintf函数:用于格式化输出数据至文件
3.sprintf函数:用于格式化字符串复制

Q11:输入

1.scanf函数:

(1)函数说明:将输入的数据根据参数format字符串来转换并格式化数据。scanf()格式转换的一般形式为
%[*][size][1][h]type
(2)返回值:成功则返回参数数目,失败则返回-1,错误原因存在errno中

2.fscanf函数:

(1)函数说明:会自参数stream的文件流中读取字符串,再根据参数format字符串来转换并格式化数据。格式转换的一般形式为%[*][size][1][h]type。转换后的结构存于对应的参数内
(2)返回值:成功则返回参数数目,失败则返回-1,错误原因存在errno中

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值