十四天学会C++之第八天:文件操作

news2024/12/23 8:17:28

1. 文件的打开和关闭

  • 文件操作的基本概念。
  • 打开文件:使用fstream库打开文件以供读写。
  • 关闭文件:确保文件在使用完毕后正确关闭。

文件的打开和关闭:C++ 文件操作入门

在C++编程中,文件操作是一项重要的任务,可以读取和写入数据到文件中。这对于数据的永久性存储和检索至关重要。

文件操作的基本概念

在进行文件操作之前,让我们先了解一些基本概念:

  • 文件:文件是数据的持久性存储方式。它可以是文本文件(包含文本信息)或二进制文件(包含二进制数据)。

  • 文件流:在C++中,文件被视为数据流。流是一个抽象的概念,用于表示数据的顺序传递。文件流分为输入流(用于读取文件)和输出流(用于写入文件)。

打开文件

要打开文件以供读取或写入,我们需要使用C++的fstream库,它提供了fstream、ifstream和ofstream三个类,分别用于文件的读取、写入和同时读写。

以下是打开文件的一般步骤:

  1. 包含头文件:首先,您需要包含 <fstream> 头文件以使用文件流类。

  2. 创建文件流对象:根据需求,创建一个输入流对象(ifstream)、输出流对象(ofstream)或输入/输出流对象(fstream)。

  3. 打开文件:使用流对象的 open 方法来打开文件。在打开文件时,需要指定文件的名称和打开模式。例如,要打开一个文本文件以供读取,使用 ifstream 并指定打开模式为 ios::in

#include <fstream>

int main() {
    // 创建输入流对象
    std::ifstream inputFile;

    // 打开文件以供读取
    inputFile.open("example.txt", std::ios::in);

    if (!inputFile) {
        // 处理文件打开失败的情况
        std::cerr << "无法打开文件" << std::endl;
        return 1;
    }

    // 文件已成功打开,可以进行读取操作

    // 关闭文件
    inputFile.close();

    return 0;
}

关闭文件

在文件操作完成后,为了确保文件被正确关闭,我们应该使用流对象的 close 方法关闭文件。这个步骤很重要,因为它确保文件在程序执行后不会被修改或损坏。

// 关闭文件
inputFile.close();

请注意,如果不关闭文件而直接退出程序,文件可能会被操作系统保持打开状态,这可能导致其他问题。

#include <iostream>
#include <fstream>

int main() {
    // 创建输出流对象
    std::ofstream outputFile;

    // 打开文件以供写入,如果文件不存在将创建新文件
    outputFile.open("example.txt", std::ios::out);

    if (!outputFile) {
        // 处理文件打开失败的情况
        std::cerr << "无法打开文件" << std::endl;
        return 1;
    }

    // 写入数据到文件
    outputFile << "这是一个示例文本文件。" << std::endl;

    // 关闭文件
    outputFile.close();

    return 0;
}

2. 文件读写

  • 读取文件:使用ifstream类读取文本文件。
  • 写入文件:使用ofstream类将数据写入文本文件。
  • 二进制文件:介绍如何读写二进制文件。

读取文件

读取文本文件

要读取文本文件,我们可以使用ifstream类,它是C++标准库中用于输入文件流的类。以下是读取文本文件的基本步骤:

  1. 包括头文件:首先,您需要包括 <fstream> 头文件以使用文件流类。

  2. 创建ifstream对象:创建一个ifstream对象,并将文件名作为参数传递给其构造函数。

  3. 打开文件:使用ifstream对象的 open 方法打开文件。

  4. 读取数据:使用输入运算符 >> 从文件中读取数据。

  5. 关闭文件:使用ifstream对象的 close 方法关闭文件。

#include <iostream>
#include <fstream>
#include <string>

int main() {
    // 创建输入文件流对象
    std::ifstream inputFile;

    // 打开文本文件以供读取
    inputFile.open("example.txt", std::ios::in);

    if (!inputFile) {
        std::cerr << "无法打开文件" << std::endl;
        return 1;
    }

    // 读取文件中的数据
    std::string line;
    while (std::getline(inputFile, line)) {
        std::cout << line << std::endl;
    }

    // 关闭文件
    inputFile.close();

    return 0;
}
写入文件

要写入数据到文本文件,我们可以使用ofstream类,它是C++标准库中用于输出文件流的类。以下是写入文本文件的基本步骤:

  1. 包括头文件:首先,您需要包括 <fstream> 头文件以使用文件流类。

  2. 创建ofstream对象:创建一个ofstream对象,并将文件名作为参数传递给其构造函数。

  3. 打开文件:使用ofstream对象的 open 方法打开文件。

  4. 写入数据:使用输出运算符 << 向文件中写入数据。

  5. 关闭文件:使用ofstream对象的 close 方法关闭文件。

#include <iostream>
#include <fstream>

int main() {
    // 创建输出文件流对象
    std::ofstream outputFile;

    // 打开文本文件以供写入,如果文件不存在将创建新文件
    outputFile.open("example.txt", std::ios::out);

    if (!outputFile) {
        std::cerr << "无法打开文件" << std::endl;
        return 1;
    }

    // 写入数据到文件
    outputFile << "这是一个示例文本文件。" << std::endl;

    // 关闭文件
    outputFile.close();

    return 0;
}

二进制文件

读写二进制文件,可以使用相同的ifstream和ofstream类,但要注意文件模式。打开二进制文件时,您需要将文件模式设置为std::ios::binary

#include <iostream>
#include <fstream>

int main() {
    // 创建二进制输出文件流对象
    std::ofstream binaryOutputFile;

    // 打开二进制文件以供写入,如果文件不存在将创建新文件
    binaryOutputFile.open("binary_data.bin", std::ios::out | std::ios::binary);

    if (!binaryOutputFile) {
        std::cerr << "无法打开文件" << std::endl;
        return 1;
    }

    // 写入二进制数据到文件
    int data[] = {1, 2, 3, 4, 5};
    binaryOutputFile.write(reinterpret_cast<char*>(data), sizeof(data));

    // 关闭文件
    binaryOutputFile.close();

    // 创建二进制输入文件流对象
    std::ifstream binaryInputFile;

    // 打开二进制文件以供读取
    binaryInputFile.open("binary_data.bin", std::ios::in | std::ios::binary);

    if (!binaryInputFile) {
        std::cerr << "无法打开文件" << std::endl;
        return 1;
    }

    // 读取二进制数据
    int readData

[5];
    binaryInputFile.read(reinterpret_cast<char*>(readData), sizeof(readData));

    // 关闭文件
    binaryInputFile.close();

    // 输出读取的数据
    for (int i = 0; i < 5; ++i) {
        std::cout << readData[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

演示如何将整数数组写入二进制文件,然后再次读取并显示。请注意,使用reinterpret_cast将整数数组的地址转换为char*,以便正确读写二进制数据。

3. 文本文件和二进制文件的处理

  • 文本文件 vs. 二进制文件:区别和适用场景。
  • 读写文本文件:如何逐行读取和写入文本文件。
  • 读写二进制文件:如何以二进制方式读写文件。

文本文件 vs. 二进制文件

文本文件通常包含可读的字符数据,如文本文档、配置文件等。它们使用普通的字符编码(如ASCII或UTF-8)来表示文本内容。文本文件易于阅读和编辑,但不适合存储非文本数据,如图像或音频。

二进制文件包含的是原始的二进制数据,没有字符编码。它们通常用于存储非文本数据,如图像、音频、视频、数据库文件等。二进制文件可以存储任何类型的数据,但不易于人类阅读或编辑。

读写文本文件

读取文本文件
#include <iostream>
#include <fstream>
#include <string>

int main() {
    std::ifstream inputFile("textfile.txt"); // 打开文本文件以供读取

    if (!inputFile) {
        std::cerr << "无法打开文件" << std::endl;
        return 1;
    }

    std::string line;
    while (std::getline(inputFile, line)) { // 逐行读取
        std::cout << line << std::endl; // 处理每行数据
    }

    inputFile.close(); // 关闭文件

    return 0;
}
写入文本文件
#include <iostream>
#include <fstream>

int main() {
    std::ofstream outputFile("output.txt"); // 打开文本文件以供写入

    if (!outputFile) {
        std::cerr << "无法打开文件" << std::endl;
        return 1;
    }

    outputFile << "写入文本文件的内容" << std::endl; // 写入数据

    outputFile.close(); // 关闭文件

    return 0;
}

读写二进制文件

读写二进制文件需要更小心,必须确保数据以正确的格式进行存储和读取。

读取二进制文件
#include <iostream>
#include <fstream>

int main() {
    std::ifstream inputFile("binaryfile.bin", std::ios::binary); // 打开二进制文件以供读取

    if (!inputFile) {
        std::cerr << "无法打开文件" << std::endl;
        return 1;
    }

    int data;
    while (inputFile.read(reinterpret_cast<char*>(&data), sizeof(int))) { // 逐块读取
        std::cout << data << " "; // 处理每个数据块
    }

    inputFile.close(); // 关闭文件

    return 0;
}
写入二进制文件
#include <iostream>
#include <fstream>

int main() {
    std::ofstream outputFile("binaryfile.bin", std::ios::binary); // 打开二进制文件以供写入

    if (!outputFile) {
        std::cerr << "无法打开文件" << std::endl;
        return 1;
    }

    int data[] = {1, 2, 3, 4, 5};

    for (int i = 0; i < 5; ++i) {
        outputFile.write(reinterpret_cast<char*>(&data[i]), sizeof(int)); // 写入数据块
    }

    outputFile.close(); // 关闭文件

    return 0;
}

请注意,二进制文件的读写中使用std::ios::binary标志,以确保以二进制模式打开文件。

4. 示例和练习

示例1:文本文件读取和写入

#include <iostream>
#include <fstream>
#include <string>

int main() {
    // 示例1: 从input.txt读取文本内容,写入output.txt

    std::ifstream inputFile("input.txt");
    std::ofstream outputFile("output.txt");

    if (!inputFile || !outputFile) {
        std::cerr << "无法打开文件" << std::endl;
        return 1;
    }

    std::string line;
    while (std::getline(inputFile, line)) {
        // 处理文本行
        outputFile << line << std::endl;
    }

    inputFile.close();
    outputFile.close();

    return 0;
}

示例2:二进制文件读取和写入

#include <iostream>
#include <fstream>

int main() {
    // 示例2: 读取和写入二进制文件

    int data[] = {1, 2, 3, 4, 5};

    std::ofstream binaryOutputFile("data.bin", std::ios::binary);
    if (!binaryOutputFile) {
        std::cerr << "无法打开文件" << std::endl;
        return 1;
    }

    binaryOutputFile.write(reinterpret_cast<char*>(data), sizeof(data));

    binaryOutputFile.close();

    std::ifstream binaryInputFile("data.bin", std::ios::binary);
    if (!binaryInputFile) {
        std::cerr << "无法打开文件" << std::endl;
        return 1;
    }

    int readData[5];
    binaryInputFile.read(reinterpret_cast<char*>(readData), sizeof(readData));

    for (int i = 0; i < 5; ++i) {
        std::cout << readData[i] << " ";
    }

    binaryInputFile.close();

    return 0;
}

练习题

问题1:创建一个程序,从用户输入中读取文本,并将其写入名为user_input.txt的文本文件。

#include <iostream>
#include <fstream>
#include <string>

int main() {
    std::string userInput;
    
    // 从用户输入读取文本
    std::cout << "请输入文本内容:" << std::endl;
    std::getline(std::cin, userInput);
    
    // 打开文件以写入内容
    std::ofstream outputFile("user_input.txt");
    
    if (!outputFile) {
        std::cerr << "无法打开文件" << std::endl;
        return 1;
    }
    
    // 写入用户输入的文本到文件
    outputFile << userInput << std::endl;
    
    // 关闭文件
    outputFile.close();
    
    std::cout << "文本已写入 user_input.txt 文件。" << std::endl;
    
    return 0;
}

运行结果:

在这里插入图片描述

问题2:创建一个程序,读取名为numbers.txt的文本文件中的数字,计算它们的总和并显示在屏幕上。

#include <iostream>
#include <fstream>

int main() {
    // 打开包含数字的文本文件
    std::ifstream inputFile("numbers.txt");
    
    if (!inputFile) {
        std::cerr << "无法打开文件" << std::endl;
        return 1;
    }
    
    int number;
    int sum = 0;
    
    // 逐行读取数字并计算总和
    while (inputFile >> number) {
        sum += number;
    }
    
    // 关闭文件
    inputFile.close();
    
    // 显示总和
    std::cout << "数字的总和为: " << sum << std::endl;
    
    return 0;
}

运行结果:

在这里插入图片描述

问题3:创建一个程序,使用二进制文件存储学生成绩数据,并编写函数来查找特定学生的分数。

#include <iostream>
#include <fstream>
#include <string>

struct Student {
    std::string name;
    int score;
};

void writeStudentData(const std::string& filename, const Student& student) {
    std::ofstream outputFile(filename, std::ios::binary | std::ios::app);
    
    if (!outputFile) {
        std::cerr << "无法打开文件" << std::endl;
        return;
    }
    
    outputFile.write(reinterpret_cast<const char*>(&student), sizeof(Student));
    outputFile.close();
}

Student findStudentData(const std::string& filename, const std::string& targetName) {
    Student student;
    
    std::ifstream inputFile(filename, std::ios::binary);
    
    if (!inputFile) {
        std::cerr << "无法打开文件" << std::endl;
        return student;
    }
    
    while (inputFile.read(reinterpret_cast<char*>(&student), sizeof(Student))) {
        if (student.name == targetName) {
            inputFile.close();
            return student;
        }
    }
    
    inputFile.close();
    student.name = "未找到";
    student.score = -1;
    return student;
}

int main() {
    // 写入学生数据到二进制文件
    Student student1 = { "Alice", 90 };
    Student student2 = { "Bob", 85 };
    writeStudentData("student_data.bin", student1);
    writeStudentData("student_data.bin", student2);

    // 查找特定学生的分数
    std::string targetName = "Alice";
    Student foundStudent = findStudentData("student_data.bin", targetName);

    if (foundStudent.name == "未找到") {
        std::cout << "找不到学生:" << targetName << std::endl;
    } else {
        std::cout << "学生姓名:" << foundStudent.name << ",分数:" << foundStudent.score << std::endl;
    }

    return 0;
}

运行结果:

在这里插入图片描述

问题4:创建一个程序,将两个文本文件合并成一个新文件。

#include <iostream>
#include <fstream>
#include <string>

int main() {
    // 打开第一个文本文件以读取内容
    std::ifstream inputFile1("file1.txt");
    
    if (!inputFile1) {
        std::cerr << "无法打开文件1" << std::endl;
        return 1;
    }

    // 打开第二个文本文件

    std::ifstream inputFile2("file2.txt");

    if (!inputFile2) {
        std::cerr << "无法打开文件2" << std::endl;
        return 1;
    }

    // 创建新文件以写入合并内容
    std::ofstream outputFile("merged_file.txt");

    if (!outputFile) {
        std::cerr << "无法创建新文件" << std::endl;
        return 1;
    }

    // 从文件1读取并写入到新文件
    std::string line;
    while (std::getline(inputFile1, line)) {
        outputFile << line << std::endl;
    }

    // 从文件2读取并写入到新文件
    while (std::getline(inputFile2, line)) {
        outputFile << line << std::endl;
    }

    // 关闭文件
    inputFile1.close();
    inputFile2.close();
    outputFile.close();

    std::cout << "文件已成功合并为 merged_file.txt" << std::endl;

    return 0;
}

运行结果:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1121103.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java日志系统之Log4j2

Log4j2介绍 Log4j2是Log4j的升级版&#xff0c;参考Logback的优秀设计并修复了一些问题。主要优点有&#xff1a; 异常处理&#xff0c;在logback中&#xff0c;Appender中的异常不会被应用感知到&#xff0c;但是在log4j2中&#xff0c;提供了一些异常处理机制。性能提升&am…

Java高级编程----集合

集合 集合概述Collection接口List接口简介ArrayList集合Set接口简介Hash Set接口简介Map接口简介TreeMap集合Properties集合 集合概述 为了在程序中可以保存数目不确定的对象&#xff0c;Java提供了一系列特殊类&#xff0c;这些类可以存储任意类型的对象&#xff0c;并且长度…

使用java mail SMTPTransport发送邮箱,本地秒到,一上服务器就20-30s左右,生产环境直接发送失败。

一、代码 pom文件 <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><!--pom.xml添加javax.mail的引用&#xff0c;或者项目引入…

【最短路径算法】一文掌握Dijkstra算法,详解与应用示例+代码

目录 1 Dijkstra算法 2 Dijkstra算法的步骤 3 Dijkstra算法python实现 4 Dijkstra算法应用示例详解 1 Dijkstra算法 Dijkstra算法&#xff08;迪杰斯特拉算法&#xff09;是一种用于在加权图中查找从一个起始节点到所有其他节点的最短路径的算法。该算法最初由荷兰计算机科…

JVM 基础篇:类加载器

一.了解JVM 1.1什么是JVM JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;是一个虚构出来的计算机&#xff0c;是通过在实际的计算机上仿真模拟计算机功能来实现的&#xff0c;JVM屏蔽了与具体操作系统平台相关的信息&#xff0c;Java程序只需…

通讯录和内存动态管理

目录 (通讯录)动态增长版 实现效果 找单身狗 题目 源码 思路 三个内存函数的模拟实现 模拟实现strncpy 模拟实现strncat 模拟实现atoi (通讯录)动态增长版 该版本通讯录在原版的基础上增加了检查容量函数&#xff0c;实现了通讯录的动态…

在PS中轻松实现肖像磨皮,感受Imagenomic Portraiture 4的强大

每个人都希望自己的肖像照片看起来漂亮、清晰并且光滑。然而&#xff0c;在处理肖像照片时&#xff0c;要达到这些效果通常需要花费大量时间和精力。如果您正在寻找一种简单快捷的方法来优化您的肖像照片&#xff0c;那么Imagenomic Portraiture 4插件将是您的理想选择。 Imag…

单接口的批量测试如何实现

一、痛点&#xff1a;一条测试数据对应一个测试方法 前面的章节中我们已经写代码实现了登录接口的处理调用&#xff0c;但是一个接口往往是需要多条测试用例才能完整的覆盖到每一种情况&#xff0c;针对于单接口多条测试用例需要执行的情况&#xff0c;该如何处理呢&#xff0…

uboot移植之mx6ull_alientek_nand.h文件详解一

一. 简介 mx6ull_alientek_nand.h文件是 开发板的 uboot的一个配置文件。每个开发板都有一个 .h的配置文件。 mx6ull_alientek_nand.h文件其实是 之前针对正点原子ALPHA开发板移植的 Uboot配置文件。 本文简单分析一下 针对正点原子ALPHA开发板的 配置文件&#xff1a; mx6u…

STL模拟实现—vector

引言&#xff1a;本篇文章主要是模拟实现vector&#xff0c;但不同于stl中vector的成员变量都是迭代器&#xff0c;这个自定义的vector是一个T* 的数据变量和一个int类型的size和int类型的capacity。&#xff08;有时间再写三个迭代器的版本吧&#xff01;&#xff09; 首先来看…

Redis学习(第八章缓存策略)

目录 RdisExample 课程介绍 1.Redis介绍 2.Redis 安装 3. Redis的数据结构 4. Redis缓存特性 5. Redis使用场景 6. Redis客户端-Jedis 7. Jedis Pipeline 8. Redis缓存策略 学习资料 QA 相关问题 http, socket ,tcp的区别 RdisExample 项目代码地址&#xff1a;htt…

Leetcode—104.二叉树的最大深度【简单】

2023每日刷题&#xff08;六&#xff09; Leetcode—104.二叉树的最大深度 递归实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/int maxDepth(struct TreeNode* root){…

2017年高热度编程语言简介

世上语言千千万&#xff0c;我却独爱这一种!”这句话用来形容程序员和编程语言之间的爱恨情仇实在是再精准不过了。根据GitHub 2016年的开源报告&#xff0c;其上所有开源项目共包含了316种编程语言&#xff0c;这是一个什么概念呢?举个例子来说&#xff0c;世界上共有226个国…

高防CDN的发展趋势

随着互联网的迅速发展&#xff0c;网站和在线服务的安全性变得至关重要。网络攻击如DDoS攻击和恶意流量正在增加&#xff0c;因此高防CDN&#xff08;高防御内容分发网络&#xff09;成为网络安全的重要组成部分。本文将探讨高防CDN未来的发展趋势&#xff0c;并比较其与传统CD…

PyCharm改变代码背景图片的使用教程

一个好的集成环境是学习和使用一门编程语言的重中之重&#xff0c;这次我给大家分享如何改变PyCharm软件的代码背景图片。 说明&#xff1a;本教程使用的是汉化版PyCharm软件。 打开PyCharm软件。 点击软件最上方导航栏的文件&#xff0c;然后找到设置。 打开设置然后点击外观…

小米妙享无法正常启动,用非管理员权限启动

网上找到的其他方法大多数不太好 1.非管理员方式运行的方法 1.创建一个用户123&#xff0c;密码123 2.创建一个bat文件&#xff0c;复制粘贴以下内容 runas /savecred /user:123 “C:\Program Files\MI\AIoT\Launch.exe” 第一次点击运行&#xff0c;要输入密码&#xff0c;以…

面试官:说说webpack的热更新是如何做到的?

一、是什么 HMR 全称 Hot Module Replacement&#xff0c;可以理解为模块热替换&#xff0c;指在应用程序运行过程中&#xff0c;替换、添加、删除模块&#xff0c;而无需重新刷新整个应用 例如&#xff0c;我们在应用运行过程中修改了某个模块&#xff0c;通过自动刷新会导致…

靶机 DC_1

DC_1 信息搜集 存活检测 详细扫描 网页目录扫描 网页信息搜集 cms 为 Drupal 漏洞利用 使用 msf 搜索 drupal 的漏洞 启动 msfconsole搜索 search drupal尝试编号为 0 的漏洞 失败 利用编号为 1 的漏洞 use 1查看需要配置的选项 show options设置目标 ip set rhost 10…

Leetcode—1726.同积元组【中等】

2023每日刷题&#xff08;六&#xff09; Leetcode—1726.同积元组 哈希表解题思路 实现代码 class Solution { public:int tupleSameProduct(vector<int>& nums) {unordered_map<int, int>count;int n nums.size();int i, j;for(i 0; i < n - 1; i) {f…

C语言实现单链表(图解增删查改+代码)

文章目录 写在前面1. 链表节点的定义2. 链表的创建3. 插入数据3.1 头插3.2 尾插3.3 在指定位置的前面插入数据 4. 删除数据4.1 头删4.2 尾删4.3 删除指定位置的数据 5. 查找数据5. 链表的销毁 写在前面 上面文章用C语言实现了顺序表的增删查改&#xff0c;本片文章继续用C语言…