【问题标题】:C++ read binary file char by charC++逐字符读取二进制文件
【发布时间】:2018-06-03 20:56:53
【问题描述】:

我的任务是按照数据成员的特定顺序保存一些对象数据,我会尽量简化 .考虑二进制文件中的这个基类构造函数。 (请注意,使用 char * 不是我的选择)。

Base(ifstream & in_file) {
    int n;
    in_file.read((char *)&n, sizeof(n));
    m_var = new char[n + 1];
    in_file.read(m_var, n);
    m_var[n] = '\0';
    in_file.read((char *)&m_intvar, sizeof(m_intvar));
}

它必须初始化 m_var (char *) 和另一个整数变量。这段代码有效,尽管它要求保存 char * 的长度以便我分配内存。

问题从这里开始。我被指示不要保存字符串的大小,而是在我写入文件的每个值之后只输入一个\n。所以我需要一些如何读取文件,并获取字符串直到\n 字符。

我正在考虑逐个字符地读取字符,但找不到方法,我认为有一个 istream 函数可以提供。我认为与文本文件的>> 类似的一些功能也很好。

【问题讨论】:

  • @ForceBru 据我所知,它是文本文件的运算符?
  • cppreference.com 是你的朋友:en.cppreference.com/w/cpp/io/basic_istream/get
  • std::getline() 怎么样?
  • 请注意,'\n' 之类的分隔符不适用于真正的二进制数据,它只能用于文本数据(文件可能以二进制模式打开,其他部分可能包含二进制数据文件)

标签: c++ file binaryfiles


【解决方案1】:

在咨询 cppreference.com 后,我的结果如下:

#include <fstream>
#include <iostream>
#include <cstring>

class Base
{
public:
    Base(std::istream & in_file) { // NOTE: changed to istream to allow reading from any stream not just files
        in_file.read((char *)&n, sizeof(n));
        char buffer[1024];
        in_file.get(buffer, sizeof(buffer), '\n');
        size_t gcount = in_file.gcount();
        if (in_file.get() != '\n')
        {
            throw std::runtime_error("binary string to long"); // you may want to implement a loop here using peek() to check for newline
        }
        m_var = new char[gcount];
        std::copy(buffer, buffer + gcount, m_var);
    }

    Base(int num, const char* strg)
        : n(num)
        , m_var(strdup(strg))
    {
    }

    bool operator == (const Base& rhs)
    {
        return n == rhs.n && strcpy(m_var, rhs.m_var);
    }

    void write(std::ostream& out)
    {
        out.write((char*)&n, sizeof(n));
        out.write(m_var, strlen(m_var));
        out.write("\n", 1);
    }


    int n;
    char* m_var = nullptr;

    ~Base()
    {
        delete m_var;
    }



};

int main(int, char**)
{
    Base b1(10, "Hello Word!");
    {
        std::ofstream out("testfile.bin");
        b1.write(out);
    }
    std::ifstream in("testfile.bin");
    Base b2(in);

    if (b1 == b2)
    {
        std::cout << "read ok!" << std::endl;
    }
    else
    {
        std::cout << "read failed!" << std::endl;
    }
    return 0;
}

【讨论】:

    猜你喜欢
    • 2013-12-06
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 2011-07-27
    相关资源
    最近更新 更多