c语言中fstream

99ANYc3cd6
预计阅读时长 15 分钟
位置: 首页 C语言 正文

fstream 是 C++ 标准库的一部分,用于文件输入输出操作,C 语言处理文件的方式与 C++ 完全不同,它使用一组在 <stdio.h> (在 C99 及以后版本中,也写作 <cstdio>) 中定义的函数。

c语言中fstream
(图片来源网络,侵删)

如果您想在 C 语言中进行文件操作,您应该使用 C 标准库提供的函数,下面我将详细介绍 C 语言的文件操作方法,并与 C++ 的 fstream 进行对比,以帮助您更好地理解。


C 语言的文件操作 (使用 <stdio.h>)

C 语言将文件视为一个字符流或字节流,通过一个指向 FILE 结构体的指针来操作文件,这个指针通常被称为“文件指针”。

核心步骤

  1. 包含头文件: #include <stdio.h>
  2. 打开文件: 使用 fopen() 函数,它会返回一个 FILE* 指针,如果打开失败,则返回 NULL
  3. 读写文件: 使用一系列函数(如 fprintf, fscanf, fread, fwrite, fgets, fputs 等)进行操作。
  4. 关闭文件: 使用 fclose() 函数,释放与文件相关的资源。

主要函数详解

打开和关闭文件

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

    • filename: 文件名。
    • mode: 打开模式,常见的有:
      • "r": 只读,文件必须存在。
      • "w": 只写,如果文件存在则清空,如果不存在则创建。
      • "a": 追加,如果文件存在则在末尾写入,如果不存在则创建。
      • "r+": 读写,文件必须存在。
      • "w+": 读写,如果文件存在则清空,如果不存在则创建。
      • "a+": 读写,在末尾追加读取。
    • 示例:
      FILE *fp;
      fp = fopen("mydata.txt", "w"); // 以只写模式打开文件,准备写入
      if (fp == NULL) {
          perror("Error opening file");
          return 1; // 打开失败,退出程序
      }
  • int fclose(FILE *stream)

    • 关闭文件指针 stream 指向的文件,并刷新缓冲区。
    • 示例:
      fclose(fp);

格式化读写 (类似 printfscanf)

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

    • 将格式化后的数据写入到文件流 stream 中。
    • 示例:
      int age = 25;
      char name[] = "Alice";
      fprintf(fp, "Name: %s, Age: %d\n", name, age);
  • int fscanf(FILE *stream, const char *format, ...)

    • 从文件流 stream 中读取格式化数据。
    • 示例:
      char read_name[50];
      int read_age;
      // 假设文件指针 fp 已经指向一个包含 "Name: Alice, Age: 25" 的文件
      fscanf(fp, "Name: %s, Age: %d", read_name, &read_age);

字符/字符串读写

  • int fgetc(FILE *stream)

    从文件流中读取一个字符。

  • int fputc(int character, FILE *stream)

    将一个字符写入文件流。

  • char *fgets(char *str, int n, FILE *stream)

    • 从文件流中读取一行(最多 n-1 个字符)到 str 中。
  • int fputs(const char *str, FILE *stream)

    • 将字符串 str 写入文件流。

二进制读写 (直接读写内存块)

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

    • 从文件流中读取 count 个大小为 size 的数据块到 ptr 指向的内存区域。
  • size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream)

    • ptr 指向的内存区域,将 count 个大小为 size 的数据块写入文件流。

C++ 的 fstream (作为对比)

为了更清晰地展示区别,这里简单介绍一下 C++ 的 fstream

C++ 的 fstream 是基于面向对象设计的,它将文件操作封装在三个类中:

  1. std::ifstream: 输入文件流,用于读取文件。
  2. std::ofstream: 输出文件流,用于写入文件。
  3. std::fstream: 双向文件流,用于读写文件。

C++ fstream 示例

#include <iostream>
#include <fstream> // C++ 的 fstream 头文件
#include <string>
int main() {
    // 写入文件
    std::ofstream out_file("mydata_cpp.txt"); // 创建一个 ofstream 对象
    if (out_file.is_open()) {
        out_file << "Hello from C++!" << std::endl;
        out_file << "Name: Bob, Age: 30" << std::endl;
        out_file.close();
    } else {
        std::cerr << "Unable to open file for writing" << std::endl;
    }
    // 读取文件
    std::ifstream in_file("mydata_cpp.txt"); // 创建一个 ifstream 对象
    if (in_file.is_open()) {
        std::string line;
        while (std::getline(in_file, line)) { // 使用 getline 逐行读取
            std::cout << line << std::endl;
        }
        in_file.close();
    } else {
        std::cerr << "Unable to open file for reading" << std::endl;
    }
    return 0;
}

C 与 C++ 文件操作对比总结

特性 C 语言 (<stdio.h>) C++ (<fstream>)
核心概念 文件指针 (FILE*),函数式接口 流对象 (ifstream, ofstream),面向对象
打开文件 fopen("filename", "mode") std::ofstream out_file("filename");
关闭文件 fclose(FILE*) out_file.close(); (析构函数也会自动关闭)
错误检查 检查 fopen 返回值是否为 NULL 使用 is_open() 成员函数或 运算符 (如 if (!out_file))
写入数据 fprintf(fp, "..."), fwrite(...) out_file << "...", out_file.write(...)
读取数据 fscanf(fp, "..."), fread(...) in_file >> ..., in_file.read(...)
优点 简单、高效、底层、C/C++ 兼容性好 类型安全、可扩展性强(如与标准流 cin/cout 类似)、更安全(RAII)
缺点 容易出错(如忘记关闭文件)、类型不安全 相对复杂一些、仅限 C++
  • 如果您正在编写 C 语言程序,请务必使用 <stdio.h> 中的函数,如 fopen, fclose, fprintf, fscanf 等。C 语言中没有 fstream
  • 如果您正在编写 C++ 程序,则强烈推荐使用 <fstream> 库,因为它更安全、更符合现代 C++ 的编程风格(RAII - 资源获取即初始化)。

希望这个解释能帮助您澄清困惑!

-- 展开阅读全文 --
头像
dede 调用随机文章
« 上一篇 今天
dede编辑后为何显示空白?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

目录[+]