必知必会的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);

    • 关闭文件流,释放相关资源。
#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 是文件指针。
#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, ...);

    • 从标准输入读取格式化的数据。
#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);
    • 输出一个错误消息。
#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);

    • 移动文件位置指示器。
#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 函数时,缓冲区会被刷新。
#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
#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);

    • 复制文件描述符到指定的文件描述符,如果指定的文件描述符已经打开,则关闭它。
#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 通常用于输出程序运行时的错误消息。

#include <stdio.h>

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

    return 0;
}

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

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 3
收藏 3
关注 25
成为作者 赚取收益
全部留言
0/200
  • dy-GkHdFjL5 03-06 15:36
    学习一下。
    回复