3. Linux标准I/O库

Linux 标准 I/O(Standard I/O)库提供了一组函数,用于进行高级别的文件输入和输出操作。它建立在底层文件 I/O 系统调用之上,为开发者提供了更方便、更高级别的文件处理方式。以下是一些常用的 Linux 标准 I/O 库函数:

1. 文件指针

标准 I/O 使用 FILE 结构表示文件流,通过文件指针(FILE*)进行操作。FILE 结构包含了文件的缓冲区、文件描述符、文件位置指示器等信息。

2. 文件打开和关闭

  • FILE* fopen(const char* filename, const char* mode);

    • 打开文件,并返回一个文件指针。
    • filename 是文件名。
    • mode 指定打开文件的模式(例如:"r" - 只读,"w" - 只写,"a" - 追加,"r+" - 读写,"w+" - 读写,"a+" - 读写追加等)。
  • int fclose(FILE* stream);

    • 关闭文件流,释放相关资源。
cpp 复制代码
#include <stdio.h>

int main() {
    // 打开文件
    FILE* file = fopen("example.txt", "r");

    if (file != NULL) {
        // 文件操作...

        // 关闭文件
        fclose(file);
    } else {
        perror("Error opening file");
    }

    return 0;
}

3. 文件读写

  • size_t fread(void* ptr, size_t size, size_t nmemb, FILE* stream);

    • 从文件读取数据到缓冲区。
    • ptr 是数据缓冲区的指针。
    • size 是每个数据项的大小。
    • nmemb 是要读取的数据项数量。
    • stream 是文件指针。
  • size_t fwrite(const void* ptr, size_t size, size_t nmemb, FILE* stream);

    • 将数据从缓冲区写入文件。
    • ptr 是数据缓冲区的指针。
    • size 是每个数据项的大小。
    • nmemb 是要写入的数据项数量。
    • stream 是文件指针。
cpp 复制代码
#include <stdio.h>

int main() {
    FILE* file = fopen("example.txt", "w");

    if (file != NULL) {
        // 写入数据
        const char* data = "Hello, Standard I/O!";
        fwrite(data, sizeof(char), strlen(data), file);

        // 关闭文件
        fclose(file);
    } else {
        perror("Error opening file");
    }

    return 0;
}

4. 标准输入输出

  • int fprintf(FILE* stream, const char* format, ...);

    • 将格式化的数据写入文件。
  • int fscanf(FILE* stream, const char* format, ...);

    • 从文件中读取格式化的数据。
  • int printf(const char* format, ...);

    • 将格式化的数据写入标准输出。
  • int scanf(const char* format, ...);

    • 从标准输入读取格式化的数据。
cpp 复制代码
#include <stdio.h>

int main() {
    FILE* file = fopen("example.txt", "w");

    if (file != NULL) {
        // 将格式化的数据写入文件
        fprintf(file, "The answer is: %d\n", 42);

        // 关闭文件
        fclose(file);
    } else {
        perror("Error opening file");
    }

    return 0;
}

5. 标准错误输出

  • int perror(const char* s);
    • 输出一个错误消息。
cpp 复制代码
#include <stdio.h>

int main() {
    FILE* file = fopen("nonexistent_file.txt", "r");

    if (file == NULL) {
        // 输出错误消息
        perror("Error opening file");
    }

    return 0;
}

6. 标准输入输出重定向

  • int fflush(FILE* stream);

    • 刷新缓冲区。
  • int setvbuf(FILE* stream, char* buffer, int mode, size_t size);

    • 设置文件流的缓冲区。
  • int fseek(FILE* stream, long offset, int whence);

    • 移动文件位置指示器。
cpp 复制代码
#include <stdio.h>

int main() {
    FILE* file = fopen("example.txt", "w");

    if (file != NULL) {
        // 写入数据
        fprintf(file, "Hello, Standard I/O!");

        // 刷新缓冲区
        fflush(file);

        // 移动文件位置指示器
        fseek(file, 0, SEEK_SET);

        // 关闭文件
        fclose(file);
    } else {
        perror("Error opening file");
    }



    return 0;
}

7. 标准输入输出缓冲

标准 I/O 库使用缓冲区来提高性能。默认情况下,标准输入(stdin)和标准输出(stdout)是行缓冲的,而标准错误输出(stderr)是无缓冲的。

  • 行缓冲:当遇到换行符 \n 时,缓冲区会被刷新。
  • 全缓冲:当缓冲区满时,或者使用 fflush 函数时,缓冲区会被刷新。
cpp 复制代码
#include <stdio.h>

int main() {
    // 默认为行缓冲,当遇到换行符时,缓冲区被刷新
    printf("Hello, ");  // 不会立即输出

    // 刷新缓冲区
    fflush(stdout);  // 输出 "Hello, "

    // 全缓冲,缓冲区满时被刷新
    printf("World!");  // 不会立即输出

    // 刷新缓冲区
    fflush(stdout);  // 输出 "World!"

    return 0;
}

8. 标准输入输出重定向

标准输入输出重定向允许程序从不同的源读取输入或将输出发送到不同的目标。这在命令行中特别有用。

  • 标准输入重定向:./program < input.txt

    • 程序从 input.txt 中读取输入。
  • 标准输出重定向:./program > output.txt

    • 程序将输出写入到 output.txt
cpp 复制代码
#include <stdio.h>

int main() {
    // 从标准输入读取数据
    int number;
    scanf("%d", &number);
    printf("You entered: %d\n", number);

    // 将输出重定向到文件
    freopen("output.txt", "w", stdout);
    printf("This will be written to output.txt\n");

    return 0;
}

9. 标准输入输出流的复制

通过 dupdup2 函数,可以复制文件描述符,实现标准输入输出流的重定向。

  • int dup(int oldfd);

    • 复制文件描述符,返回新的文件描述符。
  • int dup2(int oldfd, int newfd);

    • 复制文件描述符到指定的文件描述符,如果指定的文件描述符已经打开,则关闭它。
cpp 复制代码
#include <stdio.h>
#include <unistd.h>

int main() {
    // 复制标准输出流到文件描述符 3
    int newfd = dup(STDOUT_FILENO);

    // 输出到标准输出和新的文件描述符
    printf("Hello, Standard Output!\n");
    dprintf(newfd, "Hello, New File Descriptor!\n");

    // 关闭新的文件描述符
    close(newfd);

    return 0;
}

10. 标准错误输出

标准错误输出流 stderr 通常用于输出程序运行时的错误消息。

cpp 复制代码
#include <stdio.h>

int main() {
    fprintf(stderr, "This is an error message.\n");
    perror("An error occurred");

    return 0;
}

以上是 Linux 标准 I/O 库的一些高级特性,包括缓冲机制、输入输出重定向和文件描述符的复制。这些特性使得标准 I/O 库更加灵活,适用于各种输入输出场景。

相关推荐
存储服务专家StorageExpert15 分钟前
DELL SC compellent存储的四种访问方式
运维·服务器·存储维护·emc存储
hakesashou1 小时前
python如何比较字符串
linux·开发语言·python
Ljubim.te1 小时前
Linux基于CentOS学习【进程状态】【进程优先级】【调度与切换】【进程挂起】【进程饥饿】
linux·学习·centos
cooldream20091 小时前
Linux性能调优技巧
linux
大G哥1 小时前
记一次K8S 环境应用nginx stable-alpine 解析内部域名失败排查思路
运维·nginx·云原生·容器·kubernetes
长天一色1 小时前
【ECMAScript 从入门到进阶教程】第三部分:高级主题(高级函数与范式,元编程,正则表达式,性能优化)
服务器·开发语言·前端·javascript·性能优化·ecmascript
醉颜凉2 小时前
银河麒麟桌面操作系统修改默认Shell为Bash
运维·服务器·开发语言·bash·kylin·国产化·银河麒麟操作系统
QMCY_jason2 小时前
Ubuntu 安装RUST
linux·ubuntu·rust
慕雪华年2 小时前
【WSL】wsl中ubuntu无法通过useradd添加用户
linux·ubuntu·elasticsearch
苦逼IT运维2 小时前
YUM 源与 APT 源的详解及使用指南
linux·运维·ubuntu·centos·devops