<cstdio> 是 C++ 标准库中的一个头文件,它提供了用于输入输出操作的函数,这些函数主要继承自 C 语言中的 stdio.h,并且被 C++ 封装为 cstdio。这些函数通常用于处理文件、控制台和缓冲区的输入输出。虽然 C++ 提供了更现代的流操作方式(如 iostream),但是 cstdio 仍然在需要直接与 C 风格的 I/O 操作进行交互时非常有用。


目录

  1. 简介
  2. 常用 I/O 函数
  3. 文件流管理
  4. 与 C++ 流的比较
  5. 常见注意事项
  6. 结论

1. 简介

<cstdio> 提供了许多与输入输出相关的函数,这些函数都是 C 风格的,它们通常处理低级的输入输出操作。例如,文件的打开、读取、写入、关闭等。尽管 C++ 提供了更现代的流接口(如 <iostream>),但在处理与 C 代码兼容的输入输出时,<cstdio> 仍然是非常重要的。

要使用 <cstdio>,只需包含:

#include <cstdio>


2. 常用 I/O 函数

2.1 文件操作函数

这些函数用于打开、读取、写入和关闭文件。

  • fopen:打开文件并返回文件指针。 FILE* fopen(const char* filename, const char* mode);
    • filename:文件名。
    • mode:文件访问模式(如 "r""w""a" 等)。
  • fclose:关闭文件。 int fclose(FILE* stream);
  • fread:从文件中读取数据。 size_t fread(void* ptr, size_t size, size_t count, FILE* stream);
  • fwrite:向文件写入数据。 size_t fwrite(const void* ptr, size_t size, size_t count, FILE* stream);

示例:

#include <cstdio>

int main() {
    FILE* file = fopen("example.txt", "w");
    if (file != nullptr) {
        const char* text = "Hello, world!";
        fwrite(text, sizeof(char), strlen(text), file);
        fclose(file);
    }
    return 0;
}

2.2 标准输入输出函数

这些函数用于从标准输入(键盘)获取数据,或将数据输出到标准输出(屏幕)。

  • printf:格式化输出到标准输出。 int printf(const char* format, ...);
  • scanf:从标准输入读取格式化数据。 int scanf(const char* format, ...);
  • getchar:从标准输入读取一个字符。 int getchar(void);
  • putchar:向标准输出写入一个字符。 int putchar(int ch);

示例:

#include <cstdio>

int main() {
    int num;
    printf("Enter a number: ");
    scanf("%d", &num);
    printf("You entered: %d\n", num);
    return 0;
}

2.3 格式化输出函数

  • fprintf:将格式化的数据写入指定文件。 int fprintf(FILE* stream, const char* format, ...);
  • fscanf:从指定文件读取格式化的数据。 int fscanf(FILE* stream, const char* format, ...);

示例:

#include <cstdio>

int main() {
    FILE* file = fopen("output.txt", "w");
    if (file != nullptr) {
        fprintf(file, "Formatted number: %d\n", 42);
        fclose(file);
    }
    return 0;
}

2.4 其他 I/O 函数

  • feof:检查文件是否到达文件末尾。 int feof(FILE* stream);
  • ferror:检查文件流是否发生错误。 int ferror(FILE* stream);
  • clearerr:重置文件流的错误标志。 void clearerr(FILE* stream);
  • flush:刷新缓冲区,将数据写入文件。 int fflush(FILE* stream);

3. 文件流管理

<cstdio> 通过 FILE* 来管理文件流,FILE* 是一种指向文件对象的指针。所有文件操作(如打开、读取、写入等)都需要使用这个指针。文件操作完成后,必须使用 fclose() 函数来关闭文件,以释放资源。

打开文件:

FILE* file = fopen("file.txt", "r");

读取文件:

char buffer[100];
fread(buffer, sizeof(char), 100, file);

写入文件:

fwrite("Hello, World!", sizeof(char), 13, file);

关闭文件:

fclose(file);


4. 与 C++ 流的比较

虽然 <cstdio> 提供了广泛的 I/O 函数,但 C++ 更倾向于使用 C++ 流库(如 <iostream>)。与 C 风格的 I/O 函数相比,C++ 流操作更加面向对象,且在类型安全、异常处理和资源管理方面更为现代化。

例如,使用 C++ 流可以更简洁地完成同样的任务:

#include <iostream>

int main() {
    int num;
    std::cout << "Enter a number: ";
    std::cin >> num;
    std::cout << "You entered: " << num << std::endl;
    return 0;
}


5. 常见注意事项

  • 缓冲区管理<cstdio> 中的大部分函数都是缓冲区模式的,这意味着输出可能不会立即显示,而是先保存在内存中,直到缓冲区满或调用了 fflush()fclose()
  • 错误处理<cstdio> 函数一般会返回值来指示错误,例如 fopen() 返回 nullptrfread()fwrite() 返回实际处理的字节数,而 ferror() 可用于检查文件流错误。
  • 跨平台兼容性<cstdio> 函数是 C 风格的,在 C 和 C++ 中都是兼容的,因此可以方便地在两种语言间共享代码。

6. 结论

<cstdio> 提供了低级别的文件和控制台输入输出操作,适用于需要直接与 C 风格 API 交互的应用场景。尽管 C++ 提供了更现代的流操作机制(<iostream>),但 <cstdio> 仍然是处理简单 I/O 操作或需要与 C 代码兼容时的有力工具。理解 <cstdio> 的使用对于进行系统级编程和与 C 库交互非常重要。

推荐阅读: