cstdio 是 C++ 中的一个标准库,它是从 C 语言的 stdio.h 继承而来的,主要用于输入和输出操作。虽然 C++ 提供了更强大的输入输出流(如 iostream),但 cstdio 仍然被广泛使用,尤其是在需要与 C 语言代码交互或处理文件 I/O 的场景中。下面详细介绍 cstdio 库的使用方法,包括其核心概念和常用函数。

1. 核心概念

1.1 文件流

cstdio 中,所有的输入输出操作都是通过文件流来完成的。文件流是一个抽象的概念,用于表示输入输出的来源或目标。文件流可以是:

  • 标准输入输出流:如键盘输入(stdin)和屏幕输出(stdout)。
  • 文件流:用于读写文件。
1.2 文件指针

文件流通过文件指针(FILE*)来表示。文件指针是一个指向 FILE 结构的指针,FILE 结构是 C 标准库内部定义的,用于管理文件的状态、缓冲区等信息。用户不需要直接操作 FILE 结构,而是通过文件指针来调用相关的 I/O 函数。

2. 常用函数

2.1 文件打开与关闭
  • FILE* fopen(const char* filename, const char* mode)

    • 功能:打开一个文件。
    • 参数
      • filename:文件名(可以是相对路径或绝对路径)。
      • mode:打开文件的模式。常见的模式包括:
        • "r":以只读方式打开文件。
        • "w":以写入方式打开文件,如果文件存在则清空内容。
        • "a":以追加方式打开文件,写入的内容会追加到文件末尾。
        • "rb""wb""ab":分别以二进制模式打开文件,用于处理二进制文件。
        • "r+""w+""a+":分别以读写方式打开文件。
    • 返回值:成功时返回文件指针,失败时返回 NULL
  • int fclose(FILE* stream)

    • 功能:关闭文件。
    • 参数:文件指针。
    • 返回值:成功时返回 0,失败时返回非零值。

示例代码

#include <cstdio>
int main() {
    FILE* file = fopen("example.txt", "w");
    if (file == NULL) {
        perror("Error opening file");
        return 1;
    }
    fprintf(file, "Hello, World!\n");
    fclose(file);
    return 0;
}
2.2 文件读写
  • int fprintf(FILE* stream, const char* format, ...)

    • 功能:格式化输出到文件。
    • 参数
      • stream:文件指针。
      • format:格式化字符串,与 printf 类似。
      • ...:可变参数列表。
    • 返回值:成功时返回写入的字符数,失败时返回负值。
  • int fscanf(FILE* stream, const char* format, ...)

    • 功能:从文件中格式化读取数据。
    • 参数
      • stream:文件指针。
      • format:格式化字符串,与 scanf 类似。
      • ...:可变参数列表。
    • 返回值:成功时返回读取的输入项数,失败时返回 EOF
  • int fputc(int c, FILE* stream)

    • 功能:向文件中写入一个字符。
    • 参数
      • c:要写入的字符。
      • stream:文件指针。
    • 返回值:成功时返回写入的字符,失败时返回 EOF
  • int fgetc(FILE* stream)

    • 功能:从文件中读取一个字符。
    • 参数:文件指针。
    • 返回值:成功时返回读取的字符,文件结束时返回 EOF
  • size_t fwrite(const void* ptr, size_t size, size_t count, FILE* stream)

    • 功能:向文件中写入数据块。
    • 参数
      • ptr:指向数据的指针。
      • size:每个数据项的大小(以字节为单位)。
      • count:数据项的数量。
      • stream:文件指针。
    • 返回值:成功时返回写入的数据项数。
  • size_t fread(void* ptr, size_t size, size_t count, FILE* stream)

    • 功能:从文件中读取数据块。
    • 参数
      • ptr:指向存储数据的指针。
      • size:每个数据项的大小(以字节为单位)。
      • count:数据项的数量。
      • stream:文件指针。
    • 返回值:成功时返回读取的数据项数。

示例代码

#include <cstdio>
int main() {
    FILE* file = fopen("example.txt", "r");
    if (file == NULL) {
        perror("Error opening file");
        return 1;
    }

    char buffer[100];
    while (fscanf(file, "%s", buffer) != EOF) {
        printf("Read: %s\n", buffer);
    }

    fclose(file);
    return 0;
}
2.3 文件定位
  • int fseek(FILE* stream, long offset, int whence)

    • 功能:移动文件指针的位置。
    • 参数
      • stream:文件指针。
      • offset:偏移量。
      • whence:偏移的基准点,可以是:
        • SEEK_SET:文件开头。
        • SEEK_CUR:当前位置。
        • SEEK_END:文件末尾。
    • 返回值:成功时返回 0,失败时返回非零值。
  • long ftell(FILE* stream)

    • 功能:获取文件指针的当前位置。
    • 参数:文件指针。
    • 返回值:成功时返回当前位置,失败时返回 -1

示例代码

#include <cstdio>
int main() {
    FILE* file = fopen("example.txt", "r");
    if (file == NULL) {
        perror("Error opening file");
        return 1;
    }

    fseek(file, 0, SEEK_END); // 移动到文件末尾
    long fileSize = ftell(file); // 获取文件大小
    printf("File size: %ld bytes\n", fileSize);

    fclose(file);
    return 0;
}
2.4 错误处理
  • int ferror(FILE* stream)

    • 功能:检查文件流是否发生错误。
    • 参数:文件指针。
    • 返回值:如果发生错误,返回非零值;否则返回 0
  • void perror(const char* s)

    • 功能:打印错误信息。
    • 参数:可选的错误描述字符串。
    • 作用:将错误信息(通常是 errno 的值)打印到标准错误输出。

示例代码

#include <cstdio>
int main() {
    FILE* file = fopen("nonexistent.txt", "r");
    if (file == NULL) {
        perror("Error opening file");
        return 1;
    }

    fclose(file);
    return 0;
}

3. 其他常用函数

  • int remove(const char* filename)

    • 功能:删除文件。
    • 参数:文件名。
    • 返回值:成功时返回 0,失败时返回非零值。
  • int rename(const char* oldname, const char* newname)

    • 功能:重命名文件。
    • 参数
      • oldname:原文件名。
      • newname:新文件名。
    • 返回值:成功时返回 0,失败时返回非零值。

4. 总结

cstdio 库提供了丰富的文件操作功能,包括文件的打开、关闭、读写、定位和错误处理等。虽然 C++ 的 iostream 库在语法上更为简洁和安全,但在某些场景下(如处理二进制文件或与 C 语言代码交互)cstdio 仍然是一个非常有用的工具。掌握 cstdio 的使用方法,可以帮助你在多种编程场景中灵活处理文件 I/O 操作。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐