C++文本文件,二进制文件,write(),read(),map容器,seekg(),seekp(),tellg(),tellp()函数

2023-11-20

#include<fstream>

 一:文本文件

1.ofstream和ifstream数据类型 文本文件

ofstream f1;//该数据类型表示输出文件流,用于创建并向文件中写入信息
ifstream f2;//该数据类型表示输入文件流,用于从文件读取信息 
//f1,f2表示变量

2.从程序向文件写入字符串

void Write()
{
    string file;//文件名
    string s;//要写入文件的字符串
    f1.open(file.c_str(),ios::out);
//.c_str()是因为文件名file被声明为string,而f1.open()参数要char[]类型,所以要用.c_str()转换一下
//ios::out是定义文件被打开的模式,"out"指写入模式,这种方式会将原有的内容覆盖
    f1.open(file.c_str(),ios::app|ios::out);//这种模式会在原来的内容上追加
    f1<<s<<endl;
    f1.close();
}

3.由程序从文件中读内容

void Read()
{
    f2.open(file.c_str(),ios::in);//定义文件模式为读
    while(1)
    {
        getline(f2,s);//一行一行读取文件内容
        if(!f2.eof())  //fstream.eof()如果读到文件结束符了返回真,否则返回假
        {
            cout<<s<<endl;
        }
        else break;
     }
    f2>>n;
//假如文件中有一个数字,想要在程序中显示这个数字的平方,一定要先输入流将数字输入到文件中,见上
    cout<<n*n<<endl;
    f2.close();
}

 4.实例:英汉词典

class dictionary
{
private:
    string file;
    ifstream f1;
public:
dictionary(string ff)
{
    file=ff;
}
string word(string s)
{
    string temp;
    string::size_type n1;
    n1=s.find(" ",0);
    temp=s.substr(0,n1);
    return temp;
}
void Find()
{
    string temp,s;
    cout<<"input";cin>>temp;
    f1.open(file.c_str(),ios::in);
    if(!f1)//如果f1文件没问题可以读写,f1返回1;
    {
        cout<<"file error"<<endl;
        exit(0);
    }
    else
    {
        while(1)
        {
            getline(f1,s);
            if(!f1.eof())
            {
                if(temp==word(s))
                {
                    cout<<s<<endl;
                }
            }
            else break;
        }
    }
}
};
int main()
{
    dictionary t("英汉词典.txt");
    t.Find();
    return 0;
}

在介绍二进制文件之前,简单说一下二进制文件和文本文件的区别: 

二进制文件读写速度非常快,因为数据在内存中是以二进制存储的,二进制文件中存储的数据也是二进制形式的,所以向二进制文件写入数据的时候,内存中的数据直接不需转化放入二进制文件中。而文本文件中的数据是以字符串的形式存储的,数据从内存放入文本文件需要经过一定的编码方式转化(Unicode或ASCII码)成字符串。在读出时,二进制文件的数据不需要解码就可以直接放在内存中,但是这些二进制串我们看不懂,而文本文件需要将字符串解码,再放入内存中,所以效率稍低。我们常用的记事本是文本文件,当从内存中存入非字符串时会乱码,因为字符串在内存中是以编码方式排列好的,而数字则是以二进制形式存储,所以被解码之后会变成我们不知道的码(乱码)

二.二进制文件

fstream f;//二进制文件读写只需要一个变量

1.从程序向二进制文件中写内容

void Write()
{
    string::size_type len;
    len=s.size();
    f.open(file,ios::in|ios::out|ios::binary);//如果是类的话以上操作可以放在字符串中
//ios模式把写和读模式放在一起,还加了一个ios::binary这个是规定Windows的二进制文件换行符为一个\n
    f.write((char*)s.c_str(),len);//第一个参数是字符指针类型,第二个是要写的字符串长度
}

 write()函数的返回值通常是len,如果是-1,说明磁盘空间满了或者文件大小超出限制。

第一个参数是写入的来源,第二个参数是要写入的长度

2.从二进制文件向程序读内容并在程序中输出

void Read()
{
    string::size_type len;
    string s1;
    f.seekg(0,ios::end);//将指针移动到文件尾
    len=f.tellg();//得到当前指针位置(读取流)
    s1.resize(len);//resize第一个参数(此参数)是重新设置的内容长度,第二个参数是初始化值
    f.seekg(0,ios::beg);
    f.read((char*)s1.c_str(),len);
    cout<<s1<<endl;
}

read()函数返回值是读取的字节数,如果是-1说明出现问题; 

3.实例:英汉词典(字符串,容器,文件结合)

class test
{
private:
    string s,s1,s2;
    string::size_type n,n1,n2,n3,pos;
    map<string,string>a;
    map<string,string>::iterator p;
    fstream f;
public:
test()
{
    f.open("英汉词典.txt",ios::in|ios::out|ios::binary);//此txt文件自己预先存到对应编译器路径中
    if(!f)
    {
        cout<<"file error"<<endl;
        exit(0);
    }
    f.seekg(0,ios::end);
    n=f.tellg();
    s.resize(n);
    f.seekg(0,ios::beg);
    f.read((char*)s.c_str(),n);
    pos=0;
    while(1)
    {
        if(s.find("\n",pos)!=string::npos)
        {
            n1=s.find("\n",pos);//寻找一行的结尾
        }
        else
        {
            n1=s.size();//如果到最后一行了没有换行符,避免查找不到最后一行
        }
        s1=s.substr(pos,n1-pos);//行串
        n2=s1.find(" ",0);
        s2=s1.substr(0,n2);
        a.insert(pair<string,string>(s2,s1));//键值存入单词,second存入行串(释义);
        pos=n1+1;
        if(pos>=s.size())//判断是否读完
        break;
    }
}
void browse()//自己浏览调试
{
    for(p=a.begin();p!=a.end();++p)
    {
        cout<<p->first<<p->second<<endl;
    }
}
void Find()
{
    string temp;
    cout<<"input the word you want to check:"<<endl;cin>>temp;
    p=a.find(temp);
    if(p!=a.end())
    {
        cout<<p->second<<endl;
    }
}
~test()//析构函数关闭文件
{
    f.close();
}
};
int main()
{
    test t;
    t.Find();
    return 0;
}

4.文件加解密

class test
{
private:
    string::size_type n,n1,n2,n3;
    string s,s1,s2;
    int i;
    fstream f;
public:
test()
{
    f.open("test.doc",ios::in|ios::out|ios::binary);
    if(!f)
    {
        cout<<"file error"<<endl;
        exit(0);
    }
    f.seekg(0,ios::end);
    n=f.tellg();
    s.resize(n);
    f.seekg(0,ios::beg);
    f.read((char*)s.c_str(),n);
}
void Reverse()//字符串倒序
{
    string temp;
    temp=s;
    for(i=0;i<n;++i)
    {
        temp[i]=s[n-i-1];
    }
    s=temp;
}
void turn()//字符串前n个字符放到后面
{
    int n=100;
    s1=s.substr(0,100);
    s2=s.substr(100,n-100);
    s=s2+s1;
}
void Write()
{
    f.seekg(0,ios::beg);
    f.write((char*)s.c_str(),n);
}
~test()
{
    f.close();
}
};
int main()
{
    test t;
    t.Reverse();//t.turn();
    t.Write();
    return 0;
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++文本文件,二进制文件,write(),read(),map容器,seekg(),seekp(),tellg(),tellp()函数 的相关文章

  • 在 VS2017 下使用 Conan 和 CMake 项目进行依赖管理

    我正在尝试使用 CMake 与 VS2017 集成为 C 设置一个开发环境 以便在 Linux x64 下进行编译 为了更好地管理依赖关系 我选择使用 Conan 但我对这个软件还很陌生 我想知道让 VS2017 识别项目依赖关系的最佳方法
  • C 程序从连接到系统的 USB 设备读取数据

    我正在尝试从连接到系统 USB 端口的 USB 设备 例如随身碟 获取数据 在这里 我可以打开设备文件并读取一些随机原始数据 但我想获取像 minicom teraterm 这样的数据 请让我知道我可以使用哪些方法和库来成功完成此操作以及如
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • 如何尝试/捕获所有异常

    我正在完成由其他人启动的 UWP 应用程序 该应用程序经常崩溃 我总是陷入困境应用程序 at if global System Diagnostics Debugger IsAttached global System Diagnostic
  • 将字符串中的“奇怪”字符转换为罗马字符

    我需要能够将用户输入仅转换为 a z 罗马字符 不区分大小写 所以 我感兴趣的角色只有26个 然而 用户可以输入他们想要的任何 形式 的字符 西班牙语 n 法语 e 和德语 u 都可以包含用户输入中的重音符号 这些重音符号会被程序删除 我已
  • C++中delete和delete[]的区别[重复]

    这个问题在这里已经有答案了 可能的重复 C 中的删除与删除 运算符 https stackoverflow com questions 2425728 delete vs delete operators in c 我写了一个包含两个指针的
  • 将字符串转换为正确的 URI 格式?

    有没有简单的方法可以将电子邮件地址字符串转换为正确的 URI 格式 Input http mywebsite com validate email 3DE4ED727750215D957F8A1E4B117C38E7250C33 email
  • 无法解析远程名称 - webclient

    我面临这个错误 The remote name could not be resolved russgates85 001 site1 smarterasp net 当我请求使用 Web 客户端读取 html 内容时 出现错误 下面是我的代
  • 将带有 glut 的点击坐标添加到向量链接列表中

    我想创建一个向量链接列表 并在 GLUT 库的帮助下获取点击的位置并将它们附加到链接列表中 这些是我写的结构 typedef struct vector int x int y Vector typedef struct VectorLis
  • 两种类型的回发事件

    1 我发现了两篇文章 每篇文章对两种类型的回发事件的分类都略有不同 一位资源说两种类型的回发事件是Changed事件 其中控件实现 IPostbackDataHandler 当数据在回发之间更改时触发 然后Raised事件 其中控件实现 I
  • 从成员函数指针类型生成函子

    我正在尝试简化 通过make fn 预处理参数的函子的生成 通过wrap 对于 arity 的成员函数n 生成函子基本上可以工作 但到目前为止只能通过显式指定成员函数的参数类型来实现 现在我想从它处理的成员函数类型生成正确的函子 struc
  • C++ 插件的“最适合”动态类型匹配

    我有一个几乎所有东西都是插件的架构 该架构以图形用户界面为基础 其中每个插件都由一个 表面 即用户可以通过其与插件交互的 UI 控件 表示 这些表面也是插件 每当添加新插件时 瘦主机都会自动确定哪个可用表面与其最匹配的 UI 如何在 C 中
  • 分配器感知容器和propagate_on_container_swap

    The std allocator traits模板定义了一些常量 例如propagate on container copy move assign让其他容器知道它们是否应该在复制或移动操作期间复制第二个容器的分配器 我们还有propag
  • C# 中的常量和只读? [复制]

    这个问题在这里已经有答案了 可能的重复 const 和 readonly 之间有什么区别 https stackoverflow com questions 55984 what is the difference between cons
  • 从 R 到 C 处理列表并访问它

    我想使用从 R 获得的 C 列表 我意识到这个问题与此非常相似 使用 call 在 R 和 C 之间传递数据帧 https stackoverflow com questions 6658168 passing a data frame f
  • 使用 mingw32 在 Windows 上构建 glew 时“DllMainCRTStartup@12”的多个定义

    我关注了这个主题 使用 mingw 使建筑物在 Windows 上闪闪发光 https stackoverflow com questions 6005076 building glew on windows with mingw 6005
  • Visual Studio 2017 完全支持 C99 吗?

    Visual Studio 的最新版本改进了对 C99 的支持 最新版本VS2017现在支持所有C99吗 如果没有 C99 还缺少哪些功能 No https learn microsoft com en us cpp visual cpp
  • 受限 AppDomain 中的代码访问安全异常

    Goal 我需要在权限非常有限的 AppDomain 中运行一些代码 它不应该访问任何花哨或不安全的内容 except对于我在其他地方定义的一些辅助方法 我做了什么 我正在创建一个具有所需基本权限的沙箱 AppDomain 并创建一个运行代
  • 带有私有设置器的 EFCore Base 实体模型属性 - 迁移奇怪的行为

    实体模型继承的类内的私有设置器似乎会导致 EFCore 迁移出现奇怪的问题 考虑以下示例 其中有多个类 Bar and Baz 继承自Foo 跑步时Add Migration多次命令 添加 删除private修饰符 生成的模式在多个方面都是
  • 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同

    System Net WebException 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同 在 System Net FtpWebRequest CheckError 在 System Net FtpWebReque

随机推荐

  • Qt中两个类通过信号槽进行传输数据遇到的问题

    1 场景需求 在QGraphicsItem类中发生重绘后 希望将改动的信息在主窗口MainWindow中的textedit控件中显示出来 例如在选中的QGraphicsItem生成的对象item后 在被鼠标选中时 在textedit中显示这
  • openwrt 进入failsafe模式

    OpenWrt固件通过reset键恢复出厂设置方法 此方式适用于 忘记 OpenWrt 登入密码 配错路由器IP地址导致无法访问路由器 配错firewall或路由表导致无法登入路由器甚至无法ping路由器 操作步骤 1 把电脑的IP地址设为
  • 利用jmeter模拟手机接口测试

    利用jmeter模拟手机接口测试 由于批量上传图片不方便 可以到博主网站查阅原版博客 https blog zhenglin work jmeter use jmeter test app html 本文示例是从网上找到的月光茶人APP程序
  • 微信小程序支付完成后如何跳转指定页面

    很多人说使用reLaunch方式来跳转 此方法在 IOS 正常跳转 而在 Android 报错 relaunch fail can not invoka lelaunch in background 是因为支付成功后就会立马试图执行rela
  • Ubuntu下安装Android Studio

    Ubuntu下安装Android Studio 作者 gaolei xj更新于 05月18日访问 1568 评论 11 大晚上的睡不着 最近老失眠 索性玩玩Android Studio 我电脑的环境是Ubuntu 12 04 64位 And
  • C++包管理器vcpkg安装Opencv

    转载自 https www cnblogs com ttweixiao IT program p 12419876 html 电脑配置 window10 电脑型号 HUAWEI MateBook D 64位操作系统 基于x64的处理器 Mi
  • 磁盘调度算法笔记和练习题

    磁盘调度算法 先来先服务FCFS 最短寻道时间优先SSTF 扫描调度SCAN 练习题 先来先服务FCFS 最短寻道时间优先SSTF 扫描调度SCAN 它是一次只响应一个方向上的请求 这个方向上的请求都响应完了 再掉头处理另一个方向上的 有点
  • Centos7 安装Redis详细教程

    本文主要介绍如果在Centos7下安装Redis 1 安装依赖 redis是由C语言开发 因此安装之前必须要确保服务器已经安装了gcc 可以通过如下命令查看机器是否安装 gcc v 如果没有安装则通过以下命令安装 yum install y
  • 【C语言】 文本文件读取中文汉字出现乱码问题的解决方法

    include
  • 手把手教你如何写一个三子棋/N子棋的小游戏

    这里写目录标题 第一步 游戏进入界面 第二步 初始化棋盘 第三步 打印棋盘 第四步 玩家和电脑下棋 第五步 判断输赢 三子棋或者N子棋怎么写 让我们先来玩一把 再来看看怎么写 程序运行界面 1为玩游戏 2为清屏 0为退出游戏 我们选1 然后
  • 前端多个参数传参js

    function getparm 返回当前 URL 的查询部分 问号 之后的部分 var urlParameters location search 声明并初始化接收请求参数的对象 var requestParameters new Obj
  • PPTP中的PAC 和PNS

    http blog csdn net galdys article details 6682298 网络服务器 PNS 访问集线器 PAC PAC 可编程自动化控制器 的概念是由ARC咨询集团的高级研究员Craig Resnick提出的 在
  • rostcm6情感分析案例分析_基于情感词典的情感分析方法

    上节课我们介绍了基于SnowNLP快速进行评论数据情感分析的方法 本节课老shi将介绍基于情感词典的分析方法 基于情感词典的分析方法是情感挖掘分析方法中的一种 其普遍做法是 首先对文本进行情感词匹配 然后汇总情感词进行评分 最后得到文本的情
  • LeetCode -- 1833. 雪糕的最大数量

    使用的算法 计数排序 贪心算法 计数排序 1 基于比较的排序算法 2 在对一定范围内的整数排序时 它的复杂度为 n k 其中k是整数的范围 快于任何比较排序算法 当O k gt O nlog n 的时候其效率反而不如基于比较的排序 基于比较
  • Kali Linux进阶篇:Nmap扫描网络空间存活主机技巧

    课前声明 1 本分享仅做学习交流 请自觉遵守法律法规 2 搜索 Kali与编程 学习更多网络攻防干货 一 背景介绍 nmap是一个网络连接端扫描软件 用来扫描网上电脑开放的网络连接端 确定哪些服务运行在哪些连接端 并且推断计算机运行哪个操作
  • Java对象的快速复制的几种方式

    浅拷贝 深度复制 BeanUtils copyProperties 对象的克隆是指创建一个新的对象 且新的对象的状态与原始对象的状态相同 当对克隆的新对象进行修改时 不会影响原始对象的状态 注释 clone 是object类的protect
  • Makefile中的include命令详解

    转载地址 点击打开链接 关于Makefile中的include命令 网上有很多介绍 比较普遍的说法是 Makefile中的include命令与C语言中的include命令类似 命令include file dep 即把file dep文件在
  • 最流行的五大数据模型工具

    当今的商业决策对基于天的数据依赖越来越强烈 然而 正确而连贯的数据流对商业用户做出快速 灵活的决策起到决定性的作用 建立正确的数据流和数据结构才能保证最好的结果 这个过程叫做数据建模 为了避免认为错误并且加快进度 我们需要使用专业的软件来帮
  • CUBLAS变量解释(1)

    变量类型 cublasOperation t 解释 该类型表明输入的密集矩阵的形式 其值有 CUBLAS OP N 非转置 CUBLAS OP T 转置 CUBLAS OP C 共轭转置 该函数对应于BLAS FORTRAN版 的变量字符
  • C++文本文件,二进制文件,write(),read(),map容器,seekg(),seekp(),tellg(),tellp()函数

    include