首页 > 编程语言 >03C++文件流

03C++文件流

时间:2024-12-28 16:28:40浏览次数:7  
标签:03 文件 int age ios C++ outfile infile

03C++文件流

一、C++ IO类库

注意箭头哦!表示继承关系!如iostream多重继承istream和ostream哦!

在这里插入图片描述

二、对文本文件进行读写

  • 类库: ifstream,ofstream,fstream
2.1 文件打开方式:
模式标志描述
ios::in读方式打开文件
ios::out写方式打开文件
ios::trunc若文件存在,会在打开文件之前将文件长度截断为0(相当于清空)
ios::app尾部追加方式(在尾部写入)
ios::ate文件打开后,定位到文件尾
ios::binary二进制方式

注意:以上打开方式,可以使用位操作"|"组合起来!!

2.2 文件输出流(写文件)示意
#include <fstream> 
int main(){
   	string info = "hello,world!";
    //1.定义一个文件输出流对象
	ofstream outfile;
    //2.使用输出流对象打开一个文件,方式为输出且截断
    outfile.open("myFile.txt",ios::out|ios::trunc); 
    //3.写入文件
    outfile << info ;
    //4.关闭刚才打开的文件流
    outfile.close();
}
2.3 文件输入流(读文件)示意
  • 1、注意,>>会跳过空白字符,读取有效内容!

空格" “、制表符”\t"、换行符"\n"(创建新行)、回车符"\r"(基本不用)、换页符“\f"、垂直制表符称为“空白字符”,因为它们与打印页上的单词和行之间的空格一样都是起到方便阅读的作用。 标记由空白字符和其他标记分隔(划分边界),如运算符和标点。

  • 2、判断文件末尾–>文件结束符
//注意,>>会跳过空白符
void test2_read() {
	ifstream inf1; //由于是ifsteam,默认ios::in
	inf1.open("hello.txt");
	string name;
	int age;
	while (1) {
		inf1 >> name;
        if(inFile.eof()) break;
		inf1 >> age;
		cout << name << "\t" << age << endl;
	}
    inf1.close();
}
2.4 二进制文件读写
  • 文本文件和二进制的区别?

例:写一个数字1

文本文件:写的是字符“1”(比如char类型–>ASCII码 )

二进制文件:写的是实际的1 (int类型->四字节),写字符时,仍然是字符。

即:纯字符串时,没啥区别

写文件:

#include<fstream>
using namespace std;
int main(){
    ofstream outfile;
    file.open("my.dat",ios::out|ios::trunc|ios::binary);
    string name;
    int age;
    while(1){
        cin>>name;
       	if(cin.eof()) break;
        cin>>age;
        outfile << name <<"\t";
       //下面的方式为何不可?因为 <<方式会自动转字符串,因此实际写入还是字符串
        //outfile <<age<<endl;
       outfile.write((char*)&age,sizeof(age));//使用write方法!!!
    }
}

例如:name为rock,age为32

则二进制为:52 6f 63 6b 09 27 00 00 00

​ r o c k \t 39(4bytes)

读文件:

int main(){
    string name;
    ing age;
    ifstream infile;
    infile.open("my.dat",ios::in||ios::binary);
    while(1){
        infile>>name;
        if(infile.eof()){break;}
        infile.read((char*)&age,sizeof(char));//先读一个制表符!
        cout<<name<<"\t";
        //为何不能用>>呢?因为读字符串,然后转化为int,会出错!
        infile.read((char*)&age,sizeof(age));
        cout <<age<<endl;
    }
}
2.5 按照指定格式读写数据

写:使用stringstream

#include<sstream>
using namespace std;

int main(){
	streamstring s;
    ofstream outfile;
    outfile.open("myFile.txt",ios::out|ios::trunc); 
    //通过一下方法,格式化输出!
    s<<name<<"\t"<<age<<endl;
    outfile << s.str();
    outfile.close();
}

读:使用getline读一行,然后用sscanf格式化。

#include<sstream>
using namespace std;

int main(){
	ifstream s;
    string line;
    ofstream outfile;
    outfile.open("myFile.txt",ios::in|ios::trunc); 
	getline(infile,line);
    if(infile.eof()){break;}
    sscanf_s(line.c_str(),"姓名%s 年龄%d",name,sizeof(name),&age,sizeof(age));
    outfile.close();
}

三、文件状态位检查和文件流定位

3.1 状态位检查
  • s.is_open()
    • 文件是否打开。
  • s.eof()
    • 文件是否读完。
  • s.fail()
    • 流s的failbit位(非致命错),badbit位(致命错误)被置位时,返回true。
  • s.badbit()
    • 流的badbit位置位,返回true
  • s.good()
    • 流s处于有效状态位,返回true
  • s.clear()
    • 流s的所有状态位都被复位
3.2 文件流定位

输入流

s.seekg(off_type offset,ios::seekdir origin);//设置输入流的位置

s.seekg(0,s.end);//文件尾
  • 参数一:偏移量
  • 参数2:相对位置
    • beg 相对于开始位置
    • cur 相对于当前位置
    • end 相对于结束位置
int tellg();//返回该输出流的当前位置(距离起始位置的偏移量)

s.seekg(0,s.end);//文件尾
int filesize = infile.tellg()

输出流

seekp(off_type offset,ios::seekdir origin)//设置输出流的位置
3.3其余接口
cin.ignore(count,'\n'); //把缓冲区内容全扔掉,直到遇到'\n'(包含这个)
//count为最多扔掉的字数
//可以设为std::numeric_limits<streamsize>::max()  io流的最大字符个数

注意!!ignore会首先检测错误状态!若流处于错误状态,则不执行!!

所以clear在前,ignore在后!!

3.3其余接口
cin.ignore(count,'\n'); //把缓冲区内容全扔掉,直到遇到'\n'(包含这个)
//count为最多扔掉的字数
//可以设为std::numeric_limits<streamsize>::max()  io流的最大字符个数

注意!!ignore会首先检测错误状态!若流处于错误状态,则不执行!!

所以clear在前,ignore在后!!

标签:03,文件,int,age,ios,C++,outfile,infile
From: https://blog.csdn.net/weixin_49704754/article/details/144734743

相关文章

  • 打卡信奥刷题(500)用C++信奥P6496[普及组/提高] [COCI2016-2017#2] Nizin
    [COCI2016-2017#2]Nizin题目描述设AAA是一个含有nnn个元素的......
  • c++使用深度优先算法和广度优先算法解决迷宫问题
    求从迷宫左上角(0,0)到右下角(M-1,N-1)的路径。MxN的迷宫如下:O代表可通行,X代表不可通行。每次只能往上下左右四个方向走一步。{'O','X','X','X','X','X','X','X''O','O','O','O','O'......
  • ASP.NET MVC,Angularjs和Vue.js呈现文件图片
    周未了,又来博客园写随笔,分享程序方法,技巧,经验,把平常时常用的开发框架,语言,脚本集中总结。前段时写了些上传文件,如图片,二进制存储,后来又把上传的二进制经管理实现转存为原文件,图片缩略图等。今天把转换为文件,在网页呈现出来。决定使用ASP.NETMVC,Angularjs,vue,代码可直接写在页面......
  • DISM(Deployment Imaging Service and Management Tool)是一个用于管理和服务 Windows
    DISM(DeploymentImagingServiceandManagementTool)是一个用于管理和服务Windows映像文件(.wim或.vhd/.vhdx)的命令行工具。它主要用于修复和准备Windows操作系统映像(如ISO文件、恢复分区等)。以下是DISM命令的分类与层级结构的表格化版本,展示了常用命令及其子命令/参数......
  • MySQL General error: 1364 Field 'XXX' doesn't have a default value
    向数据库中插入数据时报了以上错误,其原因为:MySQL使用了严格验证方式解决办法mysql设置的问题,有my.ini的就找这个文件,没有的就找my.cnf(这个一般都在/ect/my.conf)直接把[mysqld]模块下的sql-mode模式改变下,找到sql-mode,然后把这句删掉,改成:sql_mode=NO_ENGINE_SUBSTITU......
  • C++中for (int i; i<track_object.region_num; i++)这样写没有对i进行初始化0也不会报
    在C++中,未初始化的局部变量(如 inti)会包含未定义的值,可能导致未定义行为(undefinedbehavior,UB)。对于以下代码:for(inti;i<track_object.region_num;i++){//Loopbody}i 没有显式初始化,因此它的初始值是未定义的。然而,你观察到代码运行时没有报错的原因可能......
  • raylib U1S03 - 反弹球
    #include<raylib.h>#include<bits/stdc++.h>usingnamespacestd;#defineWINDOW_WIDTH800#defineWINDOW_HEIGHT600intmain(){ //初始化窗口 InitWindow(WINDOW_WIDTH,WINDOW_HEIGHT,"Test"); SetTargetFPS(60); //创建一个40*40,透明背景的图片......
  • 如何清理c盘空间 芝麻清理c盘空间快准狠 不误删文件
    我们在使用电脑的过程中,长期不清理C盘垃圾,会导致C盘空间越来越小,如果你遇到电脑的C盘变红了这种情况时,这个时候已经是非常严重了,应该会感受到系统运行就会卡顿,甚至有时候会有系统报错,内存不足等各种各样奇葩的问题出现。那如何去预防和解决这个C盘垃圾导致的问题呢?请跟着小编的......
  • 批量重命名文件名称:一键处理10万+文件的高效方法 操作简单!
    批量重命名文件名称:一键处理10万+文件的高效方法操作简单!在数字化时代,我们经常会遇到需要处理大量文件的情况,无论是工作文档、图片素材还是视频资料,文件的管理和整理变得尤为重要。如何高效地批量重命名文件,成为了许多人关注的焦点。近日,一个名为“如何批量重命名文件名称?用......
  • C++ 中将 float 类型转换为 std::string
    在C++中,可以使用多种方法将 float 类型转换为 std::string 类型。以下是常用的几种方法:方法1:std::to_string (C++11及以上)这是最简单的方法之一,直接使用 std::to_string。#include<iostream>#include<string>intmain(){floatnum=123.456f;std::......