文件I/O--C++的文件操作

一、打开文件,从文件中读取、写入文件

从文件中读取数据: 

#include<fstream>  //fstream  File stream:文件流 
#include<iostream> //fstream包含了 iostream,所以这句可以省略,现在不能了 using namespace std;int main()
{ifstream in;                        //ifstream(文件读取类): input file stream :文件输入流in.open("test.txt");               //打开 "test.txt" 文件(项目所在文件夹!!!) if(!in){                           //如果in为0(!in非0) ,则:显示打开失败 ,对象返回值为0 cerr<<"打开文件失败"<<endl;   //endl:输出换行 return 0;}char x; //char:1个字节           //在c++中,可以再任何地方定义变量 while(in>>x)                     //in>>x 从文件in(test.txt)流入到字符x里面去,一次流入1个字节 {cout<<x;                    //从x流到cout(输出终端) }                               //直到没有东西流,则退出循环 cout<<endl;in.close();                    //关闭文件 return 0;
}

1.扩展:cerr、out、clog三种输出方式 

(1)std::cerr(标准错误输出):

  • 用途: 用于输出错误信息或紧急消息,主要在程序遇到错误或异常时使用。它通常用于警告、错误日志、或异常信息的输出。它适合输出紧急信息
  • 缓冲: 不带缓冲(即时输出)。输出的数据不会存储在缓冲区中,而是立即输出到控制台。这对于错误信息来说很重要,因为我们希望错误消息能尽快显示,而不是等待缓冲区被刷新。
  • 场景: 打印错误消息、调试时的异常信息。
std::cerr << "Error: Something went wrong!" << std::endl;

 (2)std::cout(标准输出):

  • 用途: 用于一般的标准输出,通常是将普通的程序输出(如结果、信息)打印到控制台。适用于用户需要查看的正常输出
  • 缓冲: 带缓冲。输出的内容通常会先进入缓冲区,然后在缓冲区满、程序结束、或调用 std::endl/std::flush 时刷新到控制台。这意味着它的性能通常较好,因为减少了频繁的IO操作。
  • 场景: 打印计算结果、程序执行状态、欢迎信息等。
std::cout << "This is a normal output." << std::endl;

 (3)std::clog(标准日志输出):

  • 用途: 用于输出日志信息,适合调试或记录程序执行情况。虽然在现代开发中,专用的日志库(如 spdlog、glog 等)更为常见,但 std::clog 是标准库中提供的日志输出流。
  • 缓冲: 带缓冲。和 std::cout 一样,std::clog 的输出也先进入缓冲区,需要手动或自动刷新。这种行为适用于日志记录,因为日志通常不会要求即时输出,但可以用来保存调试或程序运行的日志信息。
  • 场景: 写调试日志、程序跟踪信息。
std::clog << "This is a log message." << std::endl;

写入数据到文件中: 

#include<fstream>
#include<iostream>using namespace std;int main()
{ofstream out;              //ofstream:文件写入类 out.open("test1.txt");     //打开 "test.txt" 文件 if(!out){cerr<<"打开文件失败"<<endl;return 0;}for(int i=0;i<10;i++){out<<i;               //把0-9这10数字 从变量i流到了out文件(指向test.txt)里面去 }out<<endl;out.close();             //关闭文件 return 0;
}


(1)ifstream:文件读取类

  • “i”代表“input”(输入),输入文件流,这个类继承自 istream。
  • ifstream 类用于从文件中读取数据,但不能写入或更改文件的内容。
  • 示例用途包括读取配置文件、文本文件等。
  • ifstream是从硬盘到内存(其实所谓的流缓冲就是内存空间)

(2)ofstream:文件写入类

  • 输出文件流,用于 创建文件 并且向文件中 写入数据
  • ofstream是从内存到硬盘(其实所谓的流缓冲就是内存空间)

注意: fstream    文件流,有读写功能,即是以上两个的综合



二、使用构造函数打开文件 

//打开文件方式一:
ifstream in;
in.open("test.txt")//方式二:
ifstream in("test.txt");//使用构造函数(对象默认使用的方法)
//打开文件方式一:
ofstream out;
out.open("test.txt")//方式二:
ofstream out("test.txt");//使用构造函数(对象默认使用的方法)


三、文件的常见打开模式

ifstream in(char* filename,int open_mode);

  • filename:文件的名称(字符串)
  • open_mode:文件的打开模式,它的值用来定义以怎样的方式打开文件。
常见文件的打开模式
ios::in打开一个可读取文件
ios::out打开一个可写入文件
ios::binary二进制的形式打开一个文件
ios::app写入的所有数据将被追加到文件的末尾
ios::trunk删除文件原来已经存在的内容
ios::nocreate如果要打开的文件并不存在,那么以此参数调用open函数将无法进行
ios::noreplace如果要打开的文件并已经存在,试图用open函数打开时将返回一个错误
#include<fstream>
#include<iostream>using namespace std;int main()
{ofstream out("test.txt",ios::app);//以添加的形式打开 if(!out){cerr<<"文件打开失败!"<<endl;return 0; }for(int i=10;i>0;i--){out<<i;}out<<endl;out.close();return 0;
}

使用多种打开模式:使用OR操作符  "  |  ":

#include<fstream>
#include<iostream>using namespace std;int main()
{fstream fp("test1.txt",ios::in | ios::out);//以可读同时可写的形式打开 if(!fp){cerr<<"文件打开失败!"<<endl;return 0; }fp<<"IloveFish.com";//"把I love Fish.com流入到fp对象里" (写入)static char str[100];//定义一个静态的数组 (定义一个不能被改变的数组) fp.seekg(ios::beg);// ios::beg使得文件指针指向文件头  ios::end得文件指针指向文件尾 fp>>str;//把fp的内容流向str数组 cout<<str<<endl;//把数组显示到显示终端上 (读取) fp.close();//关闭文件 return 0;
}



四、课后作业:编写一个fileCopy.cpp文件,实现文件复制功能。

方式一:

#include <fstream>
#include <cstdlib>
#include <iostream>using namespace std;int main(  )
{char src_file_name[100]; //定义原文件名 char dest_file_name[100]; //定义目标文件名 cout<<"请输入源文件名: "; std::cin>> src_file_name;  //输入 原文件名 cout<<"请输入目标文件名: "; std::cin >> dest_file_name; //输入 目标件名 ifstream in(src_file_name);//打开原文件 if(!in){cerr<<"原文件文件打开失败!"<<endl;return 0; }	ofstream out(dest_file_name);//打开目标文件	if(!out){cerr<<"目标文件打开失败!"<<endl;return 0; }	//把文件内容读取出来写入目标文件中 char buffer[1024];
//    while(in>>buffer)
//	{
//	    out<<buffer;
//	}in>>buffer;out<<buffer;in.close();//关闭文件 out.close();//关闭文件 cout<<"文件复制成功"<<endl;  return 0;
}

方式二:

#include <fstream>
#include <cstdlib>
#include <iostream>using namespace std;void print_error( const char* a, const char* b=" ");int main( int argc, char* argv[] )
{//argc:argv[]数组的长度 //argv[]:内容,//for (int i=0;i<argc;i++){cout << argv[i] <<endl;}    //	cout<<argv[0]<<endl;//D:\c++demo\fileCopy1.exe if( argc!=3)                      //检查命令行参数个数是否为3: argv[0]=原文件名 argv[1]=原文件  argv[2]=目标文件{print_error( "输入形式: copyFile 源文件名 目标文件名 \n" );return 1;                    //返回非0值表示程序执行失败 }ifstream in(argv[1]);           //打开原文件 if(!in){cerr<<"原文件文件打开失败!"<<endl;return 1; }	ofstream out(argv[2]);//打开目标文件	if(!out){cerr<<"目标文件打开失败!"<<endl;return 1; }	//把文件内容读取出来写入目标文件中 char buffer[1024];
//    while(in>>buffer) //一个字节一个字节读 
//	{
//	    out<<buffer;
//	}in>>buffer;out<<buffer;in.close();//关闭文件 out.close();//关闭文件 cout<<"文件复制成功"<<endl;  return 0;
}void print_error( const char* a, const char* b)//参数为指针类型(字符串内部也是指针) 
{cout << a << endl;
}

1.扩展:返回值0 1 -1 

return 0 代表程序正常退出,return 1代表程序异常退出:

  • 在main函数中,返回0表示程序正常结束,没有发生错误。
  • 返回1一般用于表示程序执行过程中出现了某种错误或异常情况,但具体的错误类型并没有明确规定,致使一种约定俗成的表示方法。

未完待续。。。

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

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

相关文章

Redis GEO 命令详解:轻松实现“附近的人“功能

目录 引言 Redis GEO命令概述 什么是GEO命令&#xff1f; 主要命令详解 命令应用示例 添加地点信息 查询两地距离 查询附近的城市 实现"查找附近的人"功能 功能需求与实现思路 基本需求 实现思路 命令实现方案 存储用户位置 查询附近的用户 Java代码实…

C语言贪吃蛇实现

When the night gets dark,remember that the Sun is also a star. 当夜幕降临时&#xff0c;请记住太阳也是一颗星星。 ————《去月球海滩篇》 目录 文章目录 一、《贪吃蛇》游戏介绍 二、WIN32部分接口简单介绍 2.1 控制台窗口大小设置 2.2 命令行窗口的名称的变更 2…

NIO入门

IO和NIO的区别&#xff1a; IO&#xff1a;通过流处理数据&#xff0c;仅支持阻塞IO。 核心组件&#xff1a;InputStream /OutputStream用于字节的读写&#xff0c;Reader / Writer&#xff1a;用于字符流的读写。读取过程中无法被中断&#xff0c;是阻塞式IO。 NIO:通过管道处…

基于vue.js开发的家庭装修管理系统开发与设计(源码+lw+部署文档+讲解),源码可白嫖!

摘要 本家庭装修管理系统采用B/S架构&#xff0c;数据库是MySQL&#xff0c;网站的搭建与开发采用了先进的Node.js语言进行编写&#xff0c;使用了VUE框架。该系统从两个对象&#xff1a;由管理员和用户来对系统进行设计构建。用户的功能包括&#xff1a;注册、登录、浏览首页…

OpenCV图像拼接(5)图像拼接模块的用于创建权重图函数createWeightMap()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::detail::createWeightMap 是 OpenCV 库中用于图像拼接模块的一个函数&#xff0c;主要用于创建权重图。这个权重图在图像拼接过程中扮演着重…

LangGraph 怎么控制递归次数

这一节我们讲讲langgraph图的递归限制 Recursion Limit&#xff0c;递归限制设置了图在单次执行过程中可以执行的最大超级步骤数。一旦达到该限制&#xff0c;LangGraph 将引发 GraphRecursionError 错误。默认情况下&#xff0c;此值设置为 25 步。递归限制可以在运行时为任何…

08-项目中不可控的任务如何安排和验收

项目中有时会有一些任务的时间是不可控的&#xff0c;不可控的原因在于该工作完全受制于他人。意思就是如果其他人没有做好&#xff0c;比如前后端同步开发&#xff0c;前端通常可能会快一些&#xff0c;然后要等后端提供接口&#xff0c;这个时候联调工作是没办法开展的&#…

【Git】git cherry-pick(将某个分支的 commit 改动复制到当前分支)

文章目录 ‌一、基础用法1.1、‌应用单个提交1.2、‌应用多个非连续提交1.3、‌应用多个连续提交 ‌二、高级用法‌2.1、冲突处理‌2.2、放弃操作‌2.3、‌不自动提交2.4、应用分支的最新提交 ‌一、基础用法 1.1、‌应用单个提交 使用提交的哈希值&#xff08;可通过 git lo…

Milvus WeightedRanker 对比 RRF 重排机制

省流:优先选择WeightedRanker 以rag为例,优先选择bm25全文检索,其次选择向量检索 Milvus混合搜索中的重排机制 Milvus通过hybrid_search() API启用混合搜索功能&#xff0c;结合复杂的重排策略来优化多个AnnSearchRequest实例的搜索结果。本主题涵盖了重排过程&#xff0c;…

C++手撕共享指针、多线程交替、LRU缓存

1. 共享指针 #include <atomic> #include <iostream>template <typename T> class sharedptr { private:T *ptr;std::atomic<size_t> *count;public:sharedptr(T *p) : ptr(p), count(new std::atomic<size_t>(1)) {}sharedptr(const sharedptr…

新版 eslintrc 文件弃用 .eslintignore已弃用 替代方案

1.进入eslint.config.mjs文件 2.import { defineConfig, globalIgnores } from "eslint/config"; 引入globalIgnores 3.配置 defineConfig([ ... globalIgnores([ "config/*", ".husky", ".local", "public/*", ".…

基于ngnix配置本地代理到对应服务器

遇到的问题&#xff1a;服务器可以访问到的地址&#xff0c;我本地代码无法访问到 在服务器上装好nginx&#xff0c;在nginx配置文件nginx.conf中配置本地想要链接对应的服务器端口信息 server {listen 8101;location / {proxy_http_version 1.1;proxy_set_header Upgrade $h…

Go 语言 fmt 模块的完整方法详解及示例

以下是 Go 语言 fmt 模块的完整方法详解及示例&#xff0c;涵盖所有核心功能&#xff1a; 一、输出函数 将数据写入标准输出、文件或字符串。 1. Print / Println / Printf 功能 Print: 写入标准输出&#xff0c;不换行。Println: 写入标准输出并换行。Printf: 格式化写入标…

在K8S中使用ArgoCD做持续部署

一、了解argocd ArgoCD是一个基于Kubernetes的GitOps持续交付工具&#xff0c;应用的部署和更新都可以在Git仓库上同步实现&#xff0c;并自带一个可视化界面。本文介绍如何使用GitArgocd方式来实现在k8s中部署和更新应用服务。关于ci这一块这里不多介绍。主要讲解argocd如何实…

可视化图解算法:删除有序(排序)链表中重复的元素

1. 题目 描述 删除给出链表中的重复元素&#xff08;链表中元素从小到大有序&#xff09;&#xff0c;使链表中的所有元素都只出现一次 例如&#xff1a; 给出的链表为1→1→2,返回1→2. 给出的链表为1→1→2→3→3返回1→2→3. 数据范围&#xff1a;链表长度满足 0≤n≤100…

ETL:数据清洗、规范化和聚合的重要性

在当今这个数据呈爆炸式增长的时代&#xff0c;数据已成为企业最为宝贵的资产之一。然而&#xff0c;数据的海量增长也伴随着诸多问题&#xff0c;如数据来源多样、结构复杂以及质量问题等&#xff0c;这些问题严重阻碍了数据的有效处理与深度分析。在此背景下&#xff0c;ETL&…

spring boot jwt生成token

1、引入jwt依赖 <!--jwt的依赖--> <dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.18.3</version> </dependency> 2、创建TokenUtils工具类 package com.pn.utils;import com.…

豪越科技:融合低空经济的消防一体化安全管控解决方案

在科技飞速发展的当下&#xff0c;2025 年低空经济正处于规模化商用的关键节点&#xff0c;其在应急救援、物流配送等多领域展现出巨大潜力。豪越科技凭借其先进的消防一体化安全管控方案&#xff0c;与低空经济深度融合&#xff0c;打造出一套更为高效、智能的消防解决方案&am…

清华大学 | DeepSeek第十版!《DeepSeek政务应用场景及解决方案》

清华大学发布的《DeepSeek政务应用场景及解决方案》研究报告&#xff0c;聚焦人工智能技术DeepSeek在政府治理与公共服务中的创新实践&#xff0c;系统阐述了其如何通过智能化技术赋能政务数字化转型&#xff0c;推动治理能力现代化。报告指出&#xff0c;DeepSeek作为融合大数…

R语言双Y轴折线图+相关性注释

目录 包和数据 作图代码及详解 包和数据 rm(list ls()) library(ggpubr) library(scales) library(ggplot2)data <- iris##鸢尾花数据集 data1 <- data[1:30,c(1,2,3)] > head(data1)Sepal.Length Sepal.Width Petal.Length 1 5.1 3.5 …