zoukankan      html  css  js  c++  java
  • 第九章学习笔记

    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中读取最多为一行( 结尾)的字符
    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是行缓冲:如果没有遇到“ ”,则需要写满缓存区才能执行I/O操作。因为加入死循环,程序不会终止,系统不能清理缓存区,同时,行缓存的缓存区大小为1024,而要打印的字符显然无法填满缓存区,所以无法打印。

    星光荡开宇宙
  • 相关阅读:
    RESTful API入门
    $.ajax()参数详解及标准写法(转)
    Jquery 页面首次加载方式
    jQuery操作单选按钮(radio)用法
    GridView的 OnRowDataBound 事件用法
    ASP.NET文件上传大小的限制解决方案
    jQuery经典学习笔记
    Thermal management in a gaming machine
    iis7配置网站容易出现的问题(转)
    你能熟练使用Dictionary字典和List列表吗?(转)
  • 原文地址:https://www.cnblogs.com/pogbar/p/15311023.html
Copyright © 2011-2022 走看看