《信息安全系统设计与实现》第二周学习笔记
第九章 I/O库函数
- 系统调用
- 系统调用函数
- open()
- read()
- write()
- lseek()
- close()
- I/O库函数
- fopen()
- fread()
- fwrite()
- fseek()
- fclose()
- 系统调用函数
- I/O库函数的算法
- fread算法:
- 第一次调用fread()时候,FILE结构体的缓冲区时空的,fread()使用保存的文件描述符fd发出一个
n = read(fd, fbuffer, BLKSIZE);
- 在随后的每次fread()调用中,它都尝试满足来自FILE结构体 内部缓冲区的调用
- 第一次调用fread()时候,FILE结构体的缓冲区时空的,fread()使用保存的文件描述符fd发出一个
- fwirite算法:与fread类似,只是数据传输方向不同
- fclose算法:
- 若文件以写的方式被打开,fclose会先关闭文件流的局部缓冲区。
- 然后,它会发出一个close(fd)系统用来关闭FILE结构体中的文件描述符。
- 最后,它会释放FILE结构体,并将FILE指针重置为NULL
- fread算法:
- I/O库模式
- fopen()
- r:读
- w:写
- a:追加
- r+:读/写,不会截断文件
- w+:读/写,先截断文件;若文件不存在,会创建文件
- a+:通过追加进行读/写;若文件不存在,会创建文件
- 字符模式I/O
int fgetc(FILE *fp); // get achar from fp, cast to int
int ungetc(int c, FILE *fp); // push a prviously char got by fgetc() back to stream
int fputc(int c, FILE *fp); // put a char to fp
- fopen()
- 实践:编写一个C程序,将文本文件中的字母由小写转换为大写
将source.txt文件中的小写字母转换成大写字母存入target.txt中
source.txt文件中的内容
执行代码
target.txt文件中的内容
我的代码如下:
/* this file is used to convert lowercase letters to uppercase letters in the file */
#include <stdio.h>
FILE *fp,*gp;
int main()
{
int c;
fp = fopen("source.txt","r");
gp = fopen("target.txt","w");
while((c=getc(fp))!= EOF)
putc(c-32,gp);
fclose(fp);
fclose(gp);
return 0;
}
- 产生的问题:source.txt文件内容是“abcdefg”,然而target.txt中的内容却多了个问号,不是很理解原因。
对此GPT给出的答案如下:
执行结果,问号不见了
修改后的代码如下:
/* this file is used to convert lowercase letters to uppercase letters in the file */
#include <stdio.h>
FILE *fp,*gp;
int main()
{
int c;
fp = fopen("source.txt","r");
gp = fopen("target.txt","w");
while((c=getc(fp))!= EOF)
{
if(c!=EOF)
putc(c-32,gp);
}
fseek(gp, -1, SEEK_CUR);
fputc('\n',gp);
fclose(fp);
fclose(gp);
return 0;
}
代码文件等已托管
-
行模式I/O
char *fgets(char *buf, int size, FILE *fp);
:从fp中读取最多的为一行(以\n结尾)的字符。int fputs(char *buf,FILE *fp);
:将buf的一行写入fp中
-
格式化I/O
- 格式化输入:(FMT=格式字符串)
scanf(char *FMT,&items); fscanf(fp, char *FMT,&items);
- 格式化输出:
printf(char *FMT,items); fprintf(fp,char *FMT,items);
-
内存中的转换函数
sscanf(buf, FMT,&items); //input from buf[] in memory sprintf(buf FMT,items); //print to buf[] in memory
-
其他I/O库函数
- fseek()、ftell()、rewind():更该文件流中的读/写字节位置
- feof()、ferr()、fileno():测试文件流状态
- fdopen():用文件描述符打开文件流
- freopen():以新名称重新打开现有的流
- setbuf()、setvbuf():设置缓冲方案
- popen():创建管道,复刻子进程来调用sh
-
限制混合fread-fwrite
-
文件流缓冲
- 无缓冲:从非缓冲流中写入或读取的字符将尽快单独传输到文件或从文件中传输。
- 行缓冲:遇到换行符时,写入行缓冲流的字符以块的形式传输。
- 全缓冲:写入全缓冲流或从中读取的字符以块大小传输到文件或从文件传输。这是文件流的正常缓冲方案。
setvbuf(FILE *stream,char *buf , int node,int size)
-
变参函数:在I/O中 printf()相当独特,多种类型的可变数量参数都可以调用它
GPT苏格拉底挑战
-
I/O库模式
-
文件流缓冲