[英]C++ read binary file char by char
我有一个任务是按照其数据成员的特定顺序保存一些对象数据,我会尽量简化。 考虑二进制文件中的这个 Base class 构造函数。 (请注意,使用 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 *) 和另一个 integer 变量。 此代码有效,但它需要为我分配memory保存 char * 的长度。
问题从这里开始。 我被指示不要保存字符串的大小,而是在我写入文件的每个值之后只输入一个\n
。 所以我需要一些如何读取文件,并获取字符串直到\n
字符。
我正在考虑逐个字符地读取字符,但找不到方法,我假设有一个 istream function 提供了它。 我认为一些类似于 function 到文本文件的>>
也不错。
在咨询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;
}
4 年后,但我遇到了类似的问题并找到了这篇文章。 您可以像您提到的那样通过循环读取一个字符。
int i;
for(i=0;;i++){
cout<<i;
in_file.read(&buffer[i],sizeof(char));
if buffer[i]=='\n') break;
}
我提出的代码的唯一问题是它保存了'\n'。 但是您可以而且应该在找到新行“\n”后将其替换为 NULL 字符“\0”。 (缓冲区[i]=='\0')
如果我弄错了,请纠正我。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.