• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

~纯净~

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

20201302姬正坤第九章学习笔记

第九章学习笔记

1、I/O库函数

- 系统调用是文件操作的基础,但它们只支持数据块的读/写。I/O库函数是一系列文件操作函数。

2、I/O库函数与系统调用

- 在Unix/Linux中,I/O库函数建立在系统调用的基础上

a. 系统调用函数:open() read() write() lseek() close()

b. I/O库函数:fopen() fread() fwrite() fseek() fclose()

c. fopen()使用字符串表示模式,在失败时会返回一个NULL指针

3.I/O库函数的算法

1、fread算法:
在第一次调用fread()时,FILE结构体的缓冲区是是空的,fread()使用保存的文件描述符fg发出一个
n = read(fd,fbuffer,BLKSIZE);
在随后的每次调用中都尝试满足来自FILE结构体内部缓冲区的调用

2、fwrite算法:
fwrite算法与fread算法相似,数据传输方向不同,在每次调用fwrite()时,它将数据写入内部缓冲区,并调整缓冲区的指针、计数器和状态变量,以跟踪缓冲区中的字节数。如果缓冲区已满,则发出 write()系统调用,将整个缓冲区写入操作系统内核

3、fclose算法:
若文件以写的方式被打开,fcloseO会先关闭文件流的局部缓冲区。然后,它会发出一个close(fd)系统调用来关闭FILE结构体中的文件描述符。它会释放FILE结构体,并将 FILE 指针重置为 NULL。

4、使用I/O库函数或系统调用

fread()依赖read将数据从内核复制到内部缓冲区,然后从内部缓冲区将数据复制到程序的缓冲区。所以,它传输了两次数据。相反,read()将数据从内核直接复制到程序的缓冲区,只复制了一次。因此,对于以BLKSIZE为单位的读/写数据来说,read()本来就比fread()更高效,因为它只需要一个而不是两个复制操作。类似表述也适用于write()和 fwrite()。

5、I/O库模式

  • "r+":表示读/写,不会截断文件。
  • "w+":表示读/写,但是会先截断文件;如果文件不存在,会创建文件。
  • "a+":表示通过追加进行读/写;如果文件不存在,会创建文件。

字符模式I/O

  • fgetc()返回的是整数,而不是字符。
  • 对于fp=stdin或stdout,可能会使用c=getchar();putchar(c);来代替。

行模式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); // from stdin
fscanf(fp,char *FMT, &items); // from file stream

格式化输出
printf(char *FMT, items); // to stdout
fprintf(fp,char *FMT, items); // to file stream

其他I/O库函数

  • fseek()、ftell()、rewind():更改文件流中的读/写字节位置
  • feof()、ferr()、fileno():测试文件流状态
  • fdopen():用文件描述符打开文件流
  • freopen():以新名称重新打开现有的流
  • setbuf0、setvbuf():设置缓冲方案
  • popen():创建管道,复刻子进程来调用s

6、文件流缓冲

- _IONBUF:无缓冲

- _IOLBUF:行缓冲

- _IOFBUF:全缓冲

- 此外,还有其他的setbuf()函数,是setvbuf()的变体。对于行缓冲流或全缓冲流,可用fflush(stream)立即清除流的缓冲区。

7、变参函数

- 在I/O库函数中, printf()相当独特,因为多种不同类型的可变数量参数可以调用它。C语言和C++仍然允许参数数量可变的函数。这些函数必须至少使用一个参数进行声明,后跟3个点。

实践

小写字母转大写

代码:

点击查看代码

#include <stdio.h>
FILE *fp,*gp;
int main(){
        char c;
        fp=fopen("text.txt","r");
        gp=fopen("result.txt","w");
        while((c=fgetc(fp))!=EOF){
                if(c>='a'&&c<='z')c=c-32;
                fputc(c,gp);
        }
        fclose(fp);
        fclose(gp);
        return 0;
}  

posted on 2022-09-11 21:55  ~纯净~  阅读(45)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3