学习笔记2

学习笔记2

第九章

I/O库函数

  • 一系列文件操作函数

I/O库函数与系统调用

  • 系统调用函数
    open() read() write() lseek() close()
  • I/O库函数
    fopen() fread() fwrite() flseek() fclose()

I/O库函数的算法

fread算法

  • 第一次调用fread()时,FILE结构体缓冲区是空的,fread()使用保存的文件描述fd发出一个n = read(fd, fbuffer, BLKSIZE);系统调用,用数据库填充内部的fbuff[]。
  • 在随后的每次fread()调用中,它都尝试满足来自FILE结构体内部缓冲区的调用。

fwrite算法

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

fclose算法

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

  • 讨论何时使用I/O库函数何时使用系统调用的问题。eg:对以BLKSIZE为单位的读/写数据来说,read()要比fread()高效。

I/O库模式

  • 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

练习:将文件中的字母由小写转化为大小
代码:
#include <stdio.h>
#include <ctype.h>

int main() {
    FILE *inputFile, *outputFile;
    char inputFileName[100], outputFileName[100];
    int ch;

    // 获取输入和输出文件名
    printf("请输入要转换的文本文件名:");
    scanf("%s", inputFileName);
    printf("请输入输出文件名:");
    scanf("%s", outputFileName);

    // 打开输入文件
    inputFile = fopen(inputFileName, "r");
    if (inputFile == NULL) {
        printf("无法打开输入文件。\n");
        return 1;
    }

    // 打开输出文件
    outputFile = fopen(outputFileName, "w");
    if (outputFile == NULL) {
        printf("无法创建输出文件。\n");
        fclose(inputFile);
        return 1;
    }

    // 逐个字符读取并转换
    while ((ch = getc(inputFile)) != EOF) {
        ch = toupper(ch);
        putc(ch, outputFile);
    }

    // 关闭文件
    fclose(inputFile);
    fclose(outputFile);

    printf("转换完成。\n");

    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库模式




文件缓冲流




学习中遇到的问题

  • 不理解字符模式I/O一课中写的截断文件是什么意思
  • 解决过程
posted @ 2023-09-17 16:20  gaozheng08  阅读(5)  评论(0编辑  收藏  举报