正确读取二进制文件并使用流迭代器
Reading binary files and using stream iterators correctly
我试图使用这种迭代器,但以下代码出现错误:
void linearMatrix::Write_File_Matrix(const char *Path)
{
ofstream FILE(Path, std::ios::out | std::ofstream::binary);
FILE.write(reinterpret_cast<const char *>(&myWidth), sizeof(float));
FILE.write(reinterpret_cast<const char *>(&myHeight), sizeof(float));
ostreambuf_iterator<float> out_it (FILE);
copy(myVector.begin(), myVector.end(), out_it);
}
void linearMatrix::Read_File_Matrix(const char *Path)
{
ifstream FILE(Path, std::ios::in | std::ifstream::binary);
if(!FILE)
{
cerr << "Cannot open the file" << endl;
exit(1);
}
FILE.read(reinterpret_cast<const char *>(&myWidth), sizeof(myWidth));
FILE.read(reinterpret_cast<const char *>(&myHeight), sizeof(myHeight));
istreambuf_iterator<float> iter(FILE);
copy(iter.begin(), iter.end(), std::back_inserter(myVector));
}
问题是:
1-ostreambuf_iterator<float> out_it (FILE);
错误:从"void*"到的转换无效'std::ostreambuf_titerator::streambuf_type*{akastd::basic_streambuf>*}'[-f许可]
2-FILE.read(reinterpret_cast<const char *>(&myWidth), sizeof(myWidth));
错误:从"const char*"到"std::basic_stream::char_type*{aka char*}"的转换无效[-fpermission]
3-FILE.read(reinterpret_cast<const char *>(&myHeight), sizeof(myHeight));
错误:从"const char*"到的转换无效'std::basic_stream::char_type*{aka char*}'[-fpermission]
4-std::ifstream FILE(Path, std::ios::in | std::ifstream::binary);
错误:从"void*"到的转换无效'std::ostreambuf_titerator::streambuf_type*{akastd::basic_streambuf>*}'[-f许可]
5-复制(iter.begin(),iter.end(),std::back_inserter(myVector));
错误:"class std::istreambuf_editor"没有名为的成员"开始"
错误:"class std::istreambuf_editor"没有名为的成员"结束"
我做错了什么?我使用的是CUDA的nsight eclipse,但使用g++编译了一个C++项目。我指的是:正确地将std::矢量读取和写入文件
#include <iostream>
#include <algorithm>
#include <iterator>
#include <fstream>
#include <vector>
using namespace std;
void Write_File_Matrix(const char *Path)
{
float myWidth = 0;
float myHeight = 0;
vector<float> v;
v[0] = 1;
v[1] = 2;
v[2] = 3;
ofstream outFILE(Path, ios::out | ofstream::binary);
outFILE.write(reinterpret_cast<const char *>(&myWidth), sizeof(float));
outFILE.write(reinterpret_cast<const char *>(&myHeight), sizeof(float));
ostreambuf_iterator<float> out_it (outFILE);
copy(V.begin(), V.end(), out_it);
}
void Read_File_Matrix(const char *Path)
{
float myWidth = 0;
float myHeight = 0;
vector<float> v;
ifstream inFILE(Path, ios::in | ifstream::binary);
if(!inFILE)
{
cerr << "Cannot open the file" << endl;
exit(1);
}
inFILE.read(reinterpret_cast<const char *>(&myWidth), sizeof(myWidth));
inFILE.read(reinterpret_cast<const char *>(&myHeight), sizeof(myHeight));
istreambuf_iterator<float> iter(inFILE);
copy(iter.begin(), iter.end(), std::back_inserter(myVector));
}
int main() {
Write_File_Matrix("M.dat");
Read_File_Matrix("R.dat");
return 0;
}
1-ostreambuf_titerator out_it(FILE);
错误:从"void*"到"std::ostreambuf_editor::streambuf_type*{aka std::basic_streambuf>*}"的转换无效[-fpermission]
std::ostreambuf_iterator
将流的字符类型作为模板参数,而不是要转换为的类型。尝试:
std::ostreambuf_iterator<char> out_it(FILE);
4号同上。
编辑:让我们解决你的大问题而不是小问题:
不要麻烦迭代器,只需一次性写出矢量数据:
void Write_File_Matrix(const char *Path)
{
float myWidth = 0;
float myHeight = 0;
vector<float> v;
v[0] = 1;
v[1] = 2;
v[2] = 3;
ofstream outFILE(Path, ios::out | ofstream::binary);
outFILE.write(reinterpret_cast<const char *>(&myWidth), sizeof(float));
outFILE.write(reinterpret_cast<const char *>(&myHeight), sizeof(float));
outFile.write(reinterpret_cast<const char *>(&v[0]), v.size()*sizeof(float));
}
然而,阅读仍然需要一件一件地进行。
void Read_File_Matrix(const char *Path)
{
float myWidth = 0;
float myHeight = 0;
vector<float> v;
ifstream inFILE(Path, ios::in | ifstream::binary);
if(!inFILE)
{
cerr << "Cannot open the file" << endl;
exit(1);
}
inFILE.read(reinterpret_cast<char *>(&myWidth), sizeof(myWidth));
inFILE.read(reinterpret_cast<char *>(&myHeight), sizeof(myHeight));
float f;
while( inFILE.read(reinterpret_cast<char *>(&f), sizeof(f)))
v.push_back(f);
}
回复:2,3。你不能读const char*
;它是常量。改为强制转换为char*
。这就是错误消息所说的。
回复:5。是的,迭代器没有begin()
和end()
成员函数。您已经在文件的开头有了一个迭代器(一旦之前的问题得到解决)。它的名字叫iter
。现在您需要一个文件尾迭代器,正确的调用是std::copy(iter, end_iter, std::back_inserter(myVector));
。
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 如何从文件中读取 n 个字节并使用<uint8_t>迭代器将它们放入向量中?
- 无法使用迭代器在类对象的向量中读取向量
- 输入迭代器可以重复读取,而输出迭代器只能写入一次
- 我可以读取向量<string>::迭代器的数字位置吗?
- 正确读取二进制文件并使用流迭代器
- 字符串迭代器与读取每一行不兼容
- 使用迭代器数组读取稀疏信息
- Valgrind在简单迭代器类中检测到无效读取错误
- 读取大小为4的迭代器无效
- 我可以(a)不通过输入迭代器写入,或者(b)只通过一个迭代器读取一次吗?
- 迭代器应该读取整个数字,但它只读取第一位数字
- 使用迭代器读取格式化流是件好事吗
- 读取矢量迭代器时访问错误
- 使用C++迭代器从文件中读取列表