C++学习日志46-----二进制读写、文件打开模式、随机访问文件


一、二进制读写


#include<iostream>
#include<fstream>
#include<filesystem>
#include<array>
namespace fs = std::filesystem;

int main()
{
    namespace fs = std::filesystem;
    using io = std::ios;

    fs::path p{ "array.dat" };
    //创建二进制输出流
    std::fstream out{ p,io::out | io::app };

    //判断流是否成功打开 省略

    //将一个整形数组的内容输出到二进制文件中
    std::array a{ 21L,42L,63L };
    std::streamsize size = a.size() * sizeof(a[0]);
    out.write(reinterpret_cast<char*>(&a[0]), size);

    //以读取模式重新打开二进制文件,或者将文件光标定位到文件头fsteam::seekg()
    out.close();
    out.open(p, io::in);

    //从二进制流中读入一个整数并显示到品目撒谎那个
    auto x{ 0L };
    out.read(reinterpret_cast<char*>(&x), sizeof(x));
    std::cout << x << std::endl;

    std::cin.get();


    return 0;
}

在这里插入图片描述
结果如上图所示。

二、文件打开模式


#include<iostream>
#include<fstream>
#include<filesystem>
namespace fs = std::filesystem;

int main()
{
    using fo = std::ios;
    fs::path p1{ "city1.txt" }, p2{ "city.txt" };

    //创建两个输出文件流,分别为app和trunc模式
    std::ofstream out1{ p1,fo::out | fo::app };  //追加模式
    std::ofstream out2{ p2,fo::out | fo::trunc };   //trunc 每次打开会清除内容

    //从键盘读入字符,输出到两个文件流中
    char c;  
    while (!std::cin.get(c).eof())
    {
        out1.put(c);
        out2.put(c);
    }
    //关闭文件流
    out1.close();
    out2.close();

    //读模式打开两个IO文件流,期中一个使用ate模式
    std::fstream in1{ p1,fo::in };
    std::fstream in2{ p2,fo  ::in | fo::ate };  //ate模式,每次打开,光标放在最后

    //输出两个文件的内容
    std::cout << p1 << std::endl;
    while (!in1.get(c).eof())
    {
        std::cout << c;
    }
    std::cout << p2 << std::endl;
    while (!in2.get(c).eof())
    {
        std::cout << c;
    }

    //关闭IO文件流
    in1.close();
    in2.close();

    std::cin.get();

    return 0;
}

在这里插入图片描述
注意这里需要ctrl+z 结束输入。

三、随机访问文件


#include<iostream>
#include<fstream>
#include<filesystem>
#include<array>
#include<vector>

namespace fs = std::filesystem;
using std::wcout;
using std::endl;
using std::fstream;
int main()
{
    //任务1:在文件中存2个long long int 和“hello world”字符串
    fs::path p{ "test.dat" };
    fstream file{ p,std::ios::out | std::ios::in | std::ios::trunc };

    auto x{ 12LL }, y{ 24LL };
    char str[]{ "Hello World" };

    file.write(reinterpret_cast<char*>(&x), sizeof(x));
    file.write(reinterpret_cast<char*>(&y), sizeof(long long int));

    file.write(str, sizeof(str));

    //任务2:从文件中读取Hello字符串
    char buf[100]{ 0 };

    file.seekg(2 * sizeof(long long int), std::ios::beg);
    file.read(buf, 5);

    std::cout << buf << std::endl;
    return 0;
}

在这里插入图片描述
结果如上图所示。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要将二进制dat文件转换为UTF-8文本文件,你需要读取二进制文件中的数据,并将其转换为UTF-8编码后写入文本文件。下面是一个示例代码,展示了如何在C++中实现这个功能: ```cpp #include <iostream> #include <fstream> #include <vector> int main() { std::ifstream inputFile("input.dat", std::ios::binary); if (!inputFile) { std::cout << "Failed to open input file." << std::endl; return 1; } std::ofstream outputFile("output.txt", std::ios::binary); if (!outputFile) { std::cout << "Failed to create output file." << std::endl; return 1; } // 逐个字节读取二进制文件内容,并将其转换为UTF-8编码后写入文本文件 char byte; std::vector<char> utf8Bytes; while (inputFile.read(&byte, sizeof(byte))) { utf8Bytes.push_back(byte); } outputFile.write(&utf8Bytes[0], utf8Bytes.size()); inputFile.close(); outputFile.close(); std::cout << "Binary file converted to UTF-8 text successfully." << std::endl; return 0; } ``` 上述代码假设你的二进制dat文件名为"input.dat",转换后的UTF-8文本将保存在"output.txt"中。你可以根据实际情况修改文件名和路径。 请注意,上述代码仅仅是将二进制数据原封不动地写入文本文件,不进行任何字符编码转换。如果你的二进制文件中的数据实际上是以其他编码方式(如GBK、UTF-16等)保存的,你需要相应地进行字符编码转换,才能正确地将其转换为UTF-8文本。 希望这个示例能对你有所帮助!如果需要更多的解释或其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@白圭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值