如何读取和写入ppm文件
How to read and write a ppm file?
我尝试读取一个ppm文件并创建一个相同的新文件。但当我用GIMP2打开它们时,图像就不一样了。
我的代码哪里有问题?
int main()
{
FILE *in, *out;
in = fopen("parrots.ppm","r");
if( in == NULL )
{
std::cout<<"Error.n";
return 0;
}
unsigned char *buffer = NULL;
long size = 0;
fseek(in, 0, 2);
size = ftell(in);
fseek(in, 0, 0);
buffer = new unsigned char[size];
if( buffer == NULL )
{
std::cout<<"Errorn";
return 0;
}
if( fread(buffer, size, 1, in) < 0 )
{
std::cout<<"Error.n";
return 0 ;
}
out = fopen("out.ppm","w");
if( in == NULL )
{
std::cout<<"Error.n";
return 0;
}
if( fwrite(buffer, size, 1, out) < 0 )
{
std::cout<<"Error.n";
return 0;
}
delete[] buffer;
fcloseall();
return 0;
}
在此之前,我阅读了一个结构中的ppm文件,当我写它时,我得到了相同的图像,但绿色比原始图片中更强烈。然后我尝试了这种简单的阅读和写作,但我得到了同样的结果。
int main()
缺少include。
FILE *in, *out;
C++程序中的C风格I/O,为什么?此外,在初始化时声明,接近首次使用。
in = fopen("parrots.ppm","r");
这是以文本模式打开文件,这肯定不是您想要的。使用"rb"
作为模式
unsigned char *buffer = NULL;
在初始化时声明,接近首次使用。
fseek(in, 0, 2);
您应该使用SEEK_END
,,它不能保证定义为2。
fseek(in, 0, 0);
参见上文,对于不保证定义为0的SEEK_SET
。
buffer = new unsigned char[size];
if( buffer == NULL )
默认情况下,new
不会返回NULL
指针,而是抛出std::bad_alloc
异常。(由于过度分配是大多数当前操作系统的常态,即使使用malloc()
,检查NULL
也无法防止内存不足,但很高兴看到你养成了检查的习惯。)
C++11给我们带来了聪明的指针。使用它们。它们是避免内存泄漏的优秀工具(C++为数不多的弱点之一)。
if( fread(buffer, size, 1, in) < 0 )
成功使用fread
应返回写入的对象数,应检查其是否等于第三个参数(!= 1
),而不是< 0
。
out = fopen("out.ppm","w");
再次进入文本模式,此处需要"wb"
if( fwrite(buffer, size, 1, out) < 0 )
请参阅上面关于fread
返回值的注释。这里也是如此。
fcloseall();
不是标准功能。使用fclose( in );
和fclose( out );
。
一个C++11化的解决方案(为了简洁起见,省略了错误检查)看起来有点像这样:
#include <iostream>
#include <fstream>
#include <memory>
int main()
{
std::ifstream in( "parrots.ppm", std::ios::binary );
std::ofstream out( "out.ppm", std::ios::binary );
in.seekg( 0, std::ios::end );
auto size = in.tellg();
in.seekg( 0 );
std::unique_ptr< char[] > buffer( new char[ size ] );
in.read( buffer.get(), size );
out.write( buffer.get(), size );
in.close();
out.close();
return 0;
}
当然,智能解决方案将通过Boost.filesystem或标准功能(在撰写本文时是实验性的)执行实际的文件系统复制。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 如何通过C ++将圆圈写入PPM文件
- 从.ppm转换为.png文件
- C :操纵PPM文件的问题
- C 读取/写作PPM图像文件灰色图像
- 用C 编写一个PPM文件,并获得扭曲结果
- 打印出 ppm 文件的数组时出现问题
- C++程序读取ppm和pgm文件,对其进行操作并输出.编译错误
- 读取/写入PPM图像文件C++
- 读取PPM文件并使用Opengl和c++进行显示.颜色不正确
- 将字节从 P6 PPM 文件读取到字符数组 (C++)
- 如何将ppm文件转换为OpenGL纹理
- 从无符号字符*AND无符号短*指针(RGB)(C++)创建/保存PPM文件
- 如何读取和写入ppm文件
- 在c++中创建两个颜色线性渐变.ppm文件
- 读取PPM文件头(类型P6),宽度缺失
- PPM文件,c++读写
- OpenCV -如何从.ppm文件列表中生成.avi文件
- 管道ppm文件到ffmpeg在c++中创建电影