使用 stringstream 在 C++ 中读取二进制文件
Reading a binary file in c++ with stringstream
我想write/read 文件中的数据。是否可以将文件(在代码内)分成多个Strings/Sections?或者读取数据直到特定行?
就像:"Read the Data untill line 32, put it inside a String, read the next 32 lines and put it into another string"
我已经知道如何使用 seekp 读取和查找数据,但我不太喜欢它,因为我的代码总是很长。
我已经找到了一些代码,但我不明白它是如何工作的:
dataset_t* DDS::readFile(std::string filename)
{
dataset_t* dataset = NULL;
std::stringstream ss;
std::ifstream fs;
uint8_t tmp_c;
try
{
fs.open(filename.c_str(), std::ifstream::in);
if (!fs)
{
std::cout << "File not found: " << filename << std::endl;
return NULL;
}
while(fs.good())
{
fs.read((char*)&tmp_c, 1);
if (fs.good()) ss.write((char*)&tmp_c, 1);
}
fs.close();
dataset = new dataset_t();
const uint32_t bufferSize = 32;
char* buffer = new char[bufferSize];
uint32_t count = 1;
while(ss.good())
{
ss.getline(buffer, bufferSize);
dataitem_t dataitem;
dataitem.identifier = buffer;
dataitem.count = count;
dataset->push_back(dataitem);
count++;
}
return dataset;
}
catch(std::exception e)
{
cdelete(dataset);
return NULL;
}
}
代码编辑二进制保存文件。
或者有人 link 可以给我一个网站,让我可以了解有关缓冲区和字符串流的更多信息吗?
您可以创建一些 class 来模拟您的需求:take<N>
用于 'grab 32 lines',lines_from
用于遍历行。
你的 lines_from
class 可以接受任何 std::istream
:编码的东西,压缩的东西,...只要它给你一系列字符。 take<N>
会将其转换为 array<string, N>
块。
这是一个说明它的片段:
int main(){
auto lines = lines_from{std::cin};
while(lines.good()){
auto chunk = take<3>(lines);
std::cout << chunk[0][0] << chunk[1][0] << chunk[2][0] << std::endl;
}
}
下面是支持的 classes 和函数:
#include <iostream>
#include <array>
class lines_from {
public:
std::istream ∈
using value_type = std::string;
std::string operator*() {
std::string line;
std::getline(in, line);
return line;
}
bool good() const {
return in.good();
}
};
template<int N, class T>
auto take(T &range){
std::array<typename T::value_type, N> value;
for (auto &e: value) { e = *range; }
return value;
}
(在 cpp.sh 上演示)
我想write/read 文件中的数据。是否可以将文件(在代码内)分成多个Strings/Sections?或者读取数据直到特定行?
就像:"Read the Data untill line 32, put it inside a String, read the next 32 lines and put it into another string"
我已经知道如何使用 seekp 读取和查找数据,但我不太喜欢它,因为我的代码总是很长。
我已经找到了一些代码,但我不明白它是如何工作的:
dataset_t* DDS::readFile(std::string filename)
{
dataset_t* dataset = NULL;
std::stringstream ss;
std::ifstream fs;
uint8_t tmp_c;
try
{
fs.open(filename.c_str(), std::ifstream::in);
if (!fs)
{
std::cout << "File not found: " << filename << std::endl;
return NULL;
}
while(fs.good())
{
fs.read((char*)&tmp_c, 1);
if (fs.good()) ss.write((char*)&tmp_c, 1);
}
fs.close();
dataset = new dataset_t();
const uint32_t bufferSize = 32;
char* buffer = new char[bufferSize];
uint32_t count = 1;
while(ss.good())
{
ss.getline(buffer, bufferSize);
dataitem_t dataitem;
dataitem.identifier = buffer;
dataitem.count = count;
dataset->push_back(dataitem);
count++;
}
return dataset;
}
catch(std::exception e)
{
cdelete(dataset);
return NULL;
}
}
代码编辑二进制保存文件。
或者有人 link 可以给我一个网站,让我可以了解有关缓冲区和字符串流的更多信息吗?
您可以创建一些 class 来模拟您的需求:take<N>
用于 'grab 32 lines',lines_from
用于遍历行。
你的 lines_from
class 可以接受任何 std::istream
:编码的东西,压缩的东西,...只要它给你一系列字符。 take<N>
会将其转换为 array<string, N>
块。
这是一个说明它的片段:
int main(){
auto lines = lines_from{std::cin};
while(lines.good()){
auto chunk = take<3>(lines);
std::cout << chunk[0][0] << chunk[1][0] << chunk[2][0] << std::endl;
}
}
下面是支持的 classes 和函数:
#include <iostream>
#include <array>
class lines_from {
public:
std::istream ∈
using value_type = std::string;
std::string operator*() {
std::string line;
std::getline(in, line);
return line;
}
bool good() const {
return in.good();
}
};
template<int N, class T>
auto take(T &range){
std::array<typename T::value_type, N> value;
for (auto &e: value) { e = *range; }
return value;
}
(在 cpp.sh 上演示)