二进制读取器在读取确切的字节数时未触发eof位
Binary reader not triggering eof bit when reading exact number of bytes
我正在使用以下代码将图像写入二进制文件:
std::ofstream edgefile("C:\****\edge.bin", std::ofstream::binary | std::ofstream::app | std::ofstream::out);
Mat edges;
Canny(bilat, edges, cthr1, cthr2, 3); //cany sliders
if (writeedge){
int rows = edges.rows;
int cols = edges.cols;
edgefile.write(reinterpret_cast<const char *>(&rows), sizeof(int));
edgefile.write(reinterpret_cast<const char *>(&cols), sizeof(int));
edgefile.write(reinterpret_cast<char*>(edges.data), edges.rows*edges.cols*sizeof(uchar));
cout << "writen r:" << rows << "C: " << cols << "Bytes: " << edges.rows*edges.cols*sizeof(uchar) << endl;
}
然后用这个读取相同的图像:
std::ifstream infile;
int main(int argc, char* argv[])
{
int * ptr;
ptr = new int;
int rows;
int cols;
infile.open("C:\****\edge.bin", std::ofstream::binary | std::ofstream::app | std::ofstream::in);
while (!infile.eof())
{
infile.read(reinterpret_cast<char*>(ptr), sizeof(int));
rows = *ptr;
infile.read(reinterpret_cast<char*>(ptr), sizeof(int));
cols = *ptr;
Mat ed(rows, cols, CV_8UC1, Scalar::all(0));
infile.read(reinterpret_cast<char*>(ed.data), rows * cols * (sizeof uchar));
cout << "writen r: " << rows << " C: " << cols << " Bytes: " << rows * cols * (sizeof uchar) << endl;
imshow("God Knows", ed);
cvWaitKey();
}
infile.close();
return 0;
}
图像被准确地读取,但是在末尾没有触发eof位,因此乘以最后一个ptr值并在末尾读取另一个空白图像。在此之后,循环结束。如何在不重置当前读取位置的情况下检查下一位是否为EOF位?
(我知道如果再读取1个字节,就会触发EOF位)
EOF位是在您试图读取文件末尾之后设置的,这就是流的工作方式。
您可以很容易地重组主循环,以检查第一次读取后的状态。这是因为read
的返回值是对流的引用,并且将引用强制转换为bool
会检查流是否仍处于良好状态(即没有EOF)。
while (infile.read(reinterpret_cast<char*>(ptr), sizeof(int)))
{
// ...
相关文章:
- std::ifstream::read 不会读取所有 512 字节,并设置 EOF 和失败位
- 而(!inputfile.eof())只读取第一行?
- 如何在 EOF 之前从文件中读取并将其放入字符串中?
- 如何在从文件中读取整数时使用 file.eof()?
- std::cin 在读取 EOF 并清除后不再读取
- 读取 c++ istream 直到 EOF,同时丢弃内容
- 使用 gzread 读取直到 EOF 并膨胀浮点值
- Fstream 在点击 EOF 时读取行为
- .EOF 在读取文件时导致 Seg 错误:FIXXED
- 输入文件读取错误的值,eof 控制循环不会结束
- C OOP,读取文件的问题,EOF使用了两次,排行榜
- 为什么Windows不能读取超过0x1A(EOF)字符,而Unix可以?
- C++和 eof 中的文件读取
- 简单C++不读取EOF
- 如果用户输入字符串,请在用户中读取 n和eof
- std :: getline部分读取第一行,并设置eof-bit
- 在读取C 文件时跳过EOF
- 输入 EOF 后,不能重复使用 cin 来读取值
- ifstream未读取EOF字符
- 如何在C++中从cin读取EOF