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");
}
运行结果:
-
首先找到自己学号姓名的文本和二进制
-
然后在虚拟机创建bin.txt文件和text.txt文件,用来存放文本和二进制值
-
创建文件bin2textresult.txt和文件text2binresult.txt,用来保存运行结果
-
运行代码
-
查看运行结果
-
比较,结果正确,代码无误。