我有一个来自航天飞机雷达地形任务的二进制文件C1。它包含一个3601✕3601矩阵,存储为2字节大端整数.我的代码将它转换为一个可读的文本文件output.csv。
我怎样才能让它变得更好?
这是我的代码:
#include
#include
using namespace std;
const int SRTM_SIZE = 3601;
static int height[SRTM_SIZE][SRTM_SIZE] = {{0},{0}};
int main() {
ifstream file("/storage/emulated/0/input.hgt", ios::in | ios::binary);
if(!file) {
cout << "Error opening file!" << endl;
return -1;
}
unsigned char buffer[2];
for (int i = 0; i < SRTM_SIZE; ++i) {
for (int j = 0; j < SRTM_SIZE; ++j) {
if(!file.read(reinterpret_cast(buffer), sizeof(buffer) )) {
cout << "Error reading file!" << endl;
return -1; }
height[i][j] = (buffer[0] << 8) | buffer[1];
} }
ofstream meinFile;
meinFile.open ("/storage/emulated/0/output.csv");
for(int x = 0; x < SRTM_SIZE; x++)
{ // from row 1 to row SRTM size
for(int y = 0; y < SRTM_SIZE; y++)
{// from column 1 to SRTM_Size
meinFile << height[x][y] << ",";
}
meinFile << endl;
}
meinFile.close();
cout<< "Gratulations!" <发布于 2018-07-19 00:16:58
using namespace std.sizeof(int)为4,则height数组占用40 MB以上的空间。我明白,以现代标准来衡量,这是一个小小的改变,但一个好公民不应该要求太多,而不是真正需要的。我推荐一种类似流的处理:读取两个字节,转换它们,然后打印出来.这样,您只需要2字节的存储。strerror、perror或类似的设施。发布于 2018-07-19 01:20:35
连同@vnp给出的答复:
我首先要说的是,缩进使得阅读变得非常困难,所以我将使用IDE提供的脚本/宏或能够提供正确缩进的程序。
constexpr超过const任何声明为constexpr的内容都可以在编译时进行评估,从而提高运行时的性能。std::array而不是c-样式数组。
std::array (在标头中)提供边界检查和其他一些有用的函数。
reinterpret_cast这是依赖于平台的,可能会引起很多头痛。事实上,如果您必须使用reinterpret_cast,您可能需要重新分析您的代码,看看是否有更好的解决方案。
在您的例子中,我不太清楚为什么您声明了一个unsigned char数组,因为您无论如何都要将字节传输到int中。
的注记
现在,您正在像读取big endian一样从文件中读取数据,这意味着最重要的字节位于第一位。现在,这没有什么问题,但是将来如果文件规范发生了变化,您可能希望有一个参数,或者一个参数,该参数指定文件中字节的排列方式。
通常,在处理二进制文件时,记住这一点是件好事。
std::cerr而不是std::cout来处理错误消息在您的系统上,流可能指向相同的目的地,这些流可能由用户重新路由。通常,您希望分离用户界面和错误/日志记录输出。这在多线程控制台应用程序中可能变得更加重要。
如果最终目标是简单地将二进制文件转换为csv,那么为什么要使用这么多内存来存储整个二进制文件呢?输入流和输出流可以同时存在,只要它们不指向相同的路径。这意味着,您可以在读取二进制文件时写入csv文件。下面是它的样子:
...
char buffer[2];
binary_file.read(buffer, sizeof(buffer));
csv_outut << ((buffer[0] << 8) | buffer[1]) << ',';
....https://codereview.stackexchange.com/questions/199776
复制相似问题