使用 iostream 在路径中保存文件
Save file at path using iostream
我目前正在玩一些用 lua 和 love2d 实现的 3D 软件渲染。论坛中有人向我展示了这个 link 以了解更多信息:
C++ Software Renderer
这是一个用 C++ 编写的软件渲染器的教程,其中没有使用额外的库。所以我认为这将是一个好的开始。
不过我对 C++ 有点陌生,尽管我有使用 C 的经验,Objective-C、Swift、Java 和 Lua。
首先,我将 3 个文件加载到命令行 C++ Xcode 项目中。
- main.cpp
- tgaimage.h
- tgaimage.cpp
当我构建 运行 应用程序时,我应该得到一个位于 User/Libraries/Developer/Xcode/projectname/Build/Products/Debug/output.tga 中的 .tga 文件
我可以将路径更改为位于 User/Developer/Xcode Projects/tinyRenderer/ 中的工作目录,或者我可以在代码中完成。然而这正是我不知道该怎么做。
在main.cpp中:
image.write_tga_file("output.tga");
被调用。
在tgaimage.h中:
bool write_tga_file(const char *filename, bool rle=true);
和实现文件:
bool TGAImage::write_tga_file(const char *filename, bool rle) {
unsigned char developer_area_ref[4] = {0, 0, 0, 0};
unsigned char extension_area_ref[4] = {0, 0, 0, 0};
unsigned char footer[18] = {'T','R','U','E','V','I','S','I','O','N','-','X','F','I','L','E','.','[=12=]'};
std::ofstream out;
out.open (filename, std::ios::binary);
if (!out.is_open()) {
std::cerr << "can't open file " << filename << "\n";
out.close();
return false;
}
TGA_Header header;
memset((void *)&header, 0, sizeof(header));
header.bitsperpixel = bytespp<<3;
header.width = width;
header.height = height;
header.datatypecode = (bytespp==GRAYSCALE?(rle?11:3):(rle?10:2));
header.imagedescriptor = 0x20; // top-left origin
out.write((char *)&header, sizeof(header));
if (!out.good()) {
out.close();
std::cerr << "can't dump the tga file\n";
return false;
}
if (!rle) {
out.write((char *)data, width*height*bytespp);
if (!out.good()) {
std::cerr << "can't unload raw data\n";
out.close();
return false;
}
} else {
if (!unload_rle_data(out)) {
out.close();
std::cerr << "can't unload rle data\n";
return false;
}
}
out.write((char *)developer_area_ref, sizeof(developer_area_ref));
if (!out.good()) {
std::cerr << "can't dump the tga file\n";
out.close();
return false;
}
out.write((char *)extension_area_ref, sizeof(extension_area_ref));
if (!out.good()) {
std::cerr << "can't dump the tga file\n";
out.close();
return false;
}
out.write((char *)footer, sizeof(footer));
if (!out.good()) {
std::cerr << "can't dump the tga file\n";
out.close();
return false;
}
out.close();
return true;
}
如何让它将文件保存在不同的路径?
您可以通过以下方式在给定路径创建文件:
const char* out_file_path = "C:/User/Name/Documents/filename.txt";
std::ofstream out_file(out_file_path);
这会在路径 User/Name/Documents
中创建一个名为 filename.txt
的文件(在 Windows 上)。当然,这适用于您提供的任何路径,因此只需在 const char*
参数中提供必要的路径名即可。
我目前正在玩一些用 lua 和 love2d 实现的 3D 软件渲染。论坛中有人向我展示了这个 link 以了解更多信息: C++ Software Renderer
这是一个用 C++ 编写的软件渲染器的教程,其中没有使用额外的库。所以我认为这将是一个好的开始。
不过我对 C++ 有点陌生,尽管我有使用 C 的经验,Objective-C、Swift、Java 和 Lua。
首先,我将 3 个文件加载到命令行 C++ Xcode 项目中。
- main.cpp
- tgaimage.h
- tgaimage.cpp
当我构建 运行 应用程序时,我应该得到一个位于 User/Libraries/Developer/Xcode/projectname/Build/Products/Debug/output.tga 中的 .tga 文件 我可以将路径更改为位于 User/Developer/Xcode Projects/tinyRenderer/ 中的工作目录,或者我可以在代码中完成。然而这正是我不知道该怎么做。
在main.cpp中:
image.write_tga_file("output.tga");
被调用。
在tgaimage.h中:
bool write_tga_file(const char *filename, bool rle=true);
和实现文件:
bool TGAImage::write_tga_file(const char *filename, bool rle) {
unsigned char developer_area_ref[4] = {0, 0, 0, 0};
unsigned char extension_area_ref[4] = {0, 0, 0, 0};
unsigned char footer[18] = {'T','R','U','E','V','I','S','I','O','N','-','X','F','I','L','E','.','[=12=]'};
std::ofstream out;
out.open (filename, std::ios::binary);
if (!out.is_open()) {
std::cerr << "can't open file " << filename << "\n";
out.close();
return false;
}
TGA_Header header;
memset((void *)&header, 0, sizeof(header));
header.bitsperpixel = bytespp<<3;
header.width = width;
header.height = height;
header.datatypecode = (bytespp==GRAYSCALE?(rle?11:3):(rle?10:2));
header.imagedescriptor = 0x20; // top-left origin
out.write((char *)&header, sizeof(header));
if (!out.good()) {
out.close();
std::cerr << "can't dump the tga file\n";
return false;
}
if (!rle) {
out.write((char *)data, width*height*bytespp);
if (!out.good()) {
std::cerr << "can't unload raw data\n";
out.close();
return false;
}
} else {
if (!unload_rle_data(out)) {
out.close();
std::cerr << "can't unload rle data\n";
return false;
}
}
out.write((char *)developer_area_ref, sizeof(developer_area_ref));
if (!out.good()) {
std::cerr << "can't dump the tga file\n";
out.close();
return false;
}
out.write((char *)extension_area_ref, sizeof(extension_area_ref));
if (!out.good()) {
std::cerr << "can't dump the tga file\n";
out.close();
return false;
}
out.write((char *)footer, sizeof(footer));
if (!out.good()) {
std::cerr << "can't dump the tga file\n";
out.close();
return false;
}
out.close();
return true;
}
如何让它将文件保存在不同的路径?
您可以通过以下方式在给定路径创建文件:
const char* out_file_path = "C:/User/Name/Documents/filename.txt";
std::ofstream out_file(out_file_path);
这会在路径 User/Name/Documents
中创建一个名为 filename.txt
的文件(在 Windows 上)。当然,这适用于您提供的任何路径,因此只需在 const char*
参数中提供必要的路径名即可。