0.遇到的问题
1.在Ubuntu Linux20.1版本下通过快捷键Ctrl+alt+T打开终端后,如何切到 /桌面:
通过百度发现隐藏的/%USER文件夹,ls一下发现有/桌面。输入 cd /home/$USER/桌面 即可转换到桌面文件夹
2.如何切换到超级用户:与之前Linux不同的是,需要sudo su而不能直接su
自学教材第九章,提交学习笔记(10分)
本章是复习C语言中的文件操作内容,结构化从文本文件操作,二进制文件操作两个大内容考虑,以前可能只关注文本文件的操作,我们以后更多的是操作二进制文件。
文本文件中考虑字符读写,行读写,任意位置读写等
文件操作都有什么?
二进制文件和文本文件如何转换?
数据结构如何读写?
...
文件操作都有什么?
C程序把文件分为ASCII文件和二进制文件,ASCII文件又称文本文件,二进制文件和文本文件(也称ASCII码文件)二进制文件中,数值型数据是以二进制形式存储的。
关于对文件的操作主要是:添加、删除、修改、更换文件名等
二进制文件和文本文件如何转换?
二进制文本:基于值编码的文件,你可以根据具体应用,指定某个值是什么意思(这样一个过程,可以看作是自定义编码)
文本文本 :基于字符编码的文件,常见的编码有ASCII编码(本课程用的C语言就是这种编码,8bit),UNICODE编码(16bit)等等
转换:构建二进制转十六进制函数,十六进制转二进制函数,
以二转ASCll为例,每八位一组,每四位一单元转换
I/O库函数
系统调用是文件操作的基础,但它们只支持数据块的读/写,并不支持以最适合应用程序的逻辑单元读/写文件,如行、字符、结构化记录等。
I/O库函数是一系列文件操作库函数,简洁高效。
fopen fread fwrite fseek fclose ... ...
如图为打开一个文件并读取的命令行过程:
下图为对应源代码
关于fread等代码,菜鸟教程里都有,链接为: https://www.runoob.com/cprogramming/c-standard-library-stdio-h.html
字符模式I/O示例
可见,空文件storage.txt转换成了内容和testfile一致的文本
在此基础上稍加改动即可完成练习9.2:
【多加一个第九行】
依此类推,
题9.3可用fgets的次数&&读取的内容进行试探;或者判断c是否为”/”, 下一个c是否为”n”,两个”/”则重置。
题9.4可以由fgets与单词的定义进行判断
行模式I/O
char *fgets(char *buf, int size, FILE *fp):从fp中读取最多为一行(\n结尾)的字符
int fputs(char *buf,FILE *fp):将buf中的一行写入fp中
格式化I/O
- 格式化输入:
scanf
fscanf (多加了个fp, ) from file stream - 格式化输出:
printf
fprintf (多加了个fp, ) from flie stream
文件流缓冲
通过fopen()创建文件流之后,在对其执行任何操作之前,用户均可发出一个
setvbuf(FILE *stream, char *buf, int node, int size) 调用来设置缓冲区(buf)、缓冲区大小(size)和 缓冲方案(mode),它们必须是以下一个宏:
_IONBUF:无缓冲:从非缓冲流中写入(读取)的字符将尽快单独传输到文件(从文件传输)
_IOLBUF:行缓冲:遇到换行符,写入行缓冲流的字符以块的形式传输,如文件流stdout
_IOFBUF:全缓冲:文件流的正常缓冲方案,以块大小传出
通过示例理解不同的缓冲方案
#include<stdio.h>
int main(){
//setvbuf(stdout, NULL, _IONBF, 0); //设置缓冲区
while(1){
printf(“hi”); //not a line yet
//fflush(stdout); //清除stdout
sleep(1); //sleep for 1 second
}
}
设置缓冲区的效果为无缓冲,则每秒打印一个hi
如果不设置,因为stdout是行缓冲,则只有当打印出来的字符与stdout的所有内部缓冲区匹配时,才会输出。
示例9.6代码不输出的原因如下:
stdout是行缓冲:如果没有遇到“\n”,则需要写满缓存区才能执行I/O操作。因为加入死循环,程序不会终止,系统不能清理缓存区,同时,行缓存的缓存区大小为1024,而要打印的字符显然无法填满缓存区,所以无法打印。