zoukankan      html  css  js  c++  java
  • Unix/Linix系统编程第九章学习笔记

    Unix/Linix系统编程第九章学习笔记

    作者:20191322wyl

    知识点总结

    I/O库函数与系统调用

    • 系统调用函数:open()、read()、write()、lseek()、close()

    • I/O库函数:fopen()、fread()、fwrite()、fseek()、fclose()

      fopen()函数使用字符串表示模式,"r"表示"read"(可读)、“w”表示"write"表示“write”(可写);

      如果有任何fopen()调用失败,程序就会终止

    I/O库函数的算法

    fread算法

    • fread()一方面接受来自用户程序的调用,另一方面向操作系统内核发出read()系统调用
    • 除了read()系统调用外,所有fread()处理都在用户模式镜像中执行

    fwite算法

    • 与fread()算啊相似,只是数据传输方向不同

    fclose算法

    关闭文件

    I/O库模式

    文件结束符通常是返回一个整数-1

    格式化I/O

    输入:

    • scanf(char *FMT,&items)//从stdin中读取
    • fscanf(fp,char*FMT,&items)//从流中读取

    文件流缓冲

    • 无缓冲:从非缓冲流中写入或读取的字符将尽快单独传输到文件或从文件中传输
    • 行缓冲:遇到换行符时,写入行缓冲流的字符以块的形式传输
    • 全缓冲:写入全缓冲流或从中读取的字符以块大小传输到文件或从文件传输

    二进制文件和文本文件如何转换?

    解决方案:

    因为可显示字符有256个,即需要8位二进制才能表示出来,所以文本文件转换为二进制文件就相当于把AscII码字符(10进制)转换成八位2进制,即核心就是10进制转换成2进制的算法,同理,二进制文件转换为文本文件的核心就是2进制转换成10进制。

    具体代码看实践

    实践内容

    • 设计一个程序,该程序读取文本文件(包含 ASCII字符的文件),并使用0和1将所有字符编码为二进制字符
    • 设计一个程序,它将读取二进制文件,并将二进制文件的内容转换为 ASCII 字符序列

    代码:

    #include <stdio.h>
    #include <string.h>
    #define NSIZE 8
    void text2bin(const char* sIn, const char* sOut)// text to bin 
    {
    	int count = 0;
    	int ch,a;
    	char temp;
    	FILE * fin = fopen(sIn, "r");
    	FILE * fout = fopen(sOut, "w");
    	while(fscanf(fin, "%c", &temp)!=EOF) {
    		ch=temp;
    		for (a = 7; a >= 0; a--) fprintf(fout, "%d", ch >> a & 1);
    	}
    	fclose(fin);
    	fclose(fout);
    
    }
    void bin2text(const char* sIn, const char* sOut)//bin to text 
    {
    	FILE * fin = fopen(sIn, "r");
    	FILE * fout = fopen(sOut, "w");
    	int i = 0, j = 0, iTemp = 0, flag = 0;
    	int ibina[NSIZE];
    	char cRead[NSIZE];
    	char str[8];
    	char cChar;
    	int a=0;
    	while(fscanf(fin, "%c", &str[a%8])!=EOF) {
    		if(a%8==7) {
    			iTemp = 1;
    			cChar = 0;
    			for (j = 7; j >= 0; j--) {
    				cChar += (str[j]-'0') * iTemp;
    				iTemp *= 2;
    			}
    			fprintf(fout, "%c", cChar);
    		}
    		a++;
    	}
    	fclose(fin);
    	fclose(fout);
    
    }
    
    int main()
    {
    	bin2text("bin.txt","bin2textresult.txt");
    	text2bin("text.txt","text2binresult.txt");
    }
    

    运行结果:

    1. 首先找到自己学号姓名的文本和二进制

    2. 然后在虚拟机创建bin.txt文件和text.txt文件,用来存放文本和二进制值

    3. 创建文件bin2textresult.txt和文件text2binresult.txt,用来保存运行结果

    4. 运行代码

    5. 查看运行结果

    6. 比较,结果正确,代码无误。

  • 相关阅读:
    C# 串口操作系列(2) -- 入门篇,为什么我的串口程序在关闭串口时候会死锁 ?
    C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子。
    嵌入式
    [转] Java程序员学C#基本语法两个小时搞定(对比学习)
    test
    LeetCode 【困难】数据库-第1412 :查找成绩处于中游的学生
    LeetCode 【困难】数据库-第1384 :按照年度列出销售总额(每个产品、每年、总销额)
    LeetCode 【困难】数据库-第1369 :获取最近第二次的活动
    LeetCode 【困难】数据库-第1336(超困难):每次访问的交易次数
    LeetCode 【困难】数据库-第1225:报告系统状态的连续日期
  • 原文地址:https://www.cnblogs.com/BillGreen/p/15312354.html
Copyright © 2011-2022 走看看