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,用来保存运行结果
-
运行代码
-
查看运行结果
-
比较,结果正确,代码无误。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现