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 库更加灵活,适用于各种输入输出场景。

相关推荐
A小辣椒20 小时前
TShark:Wireshark CLI 功能
linux
A小辣椒1 天前
TShark:基础知识
linux
AlfredZhao1 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式