【问题标题】:Read binary (.hgt) file in C (Migrate code from C++ to C)读取 C 中的二进制 (.hgt) 文件(将代码从 C++ 迁移到 C)
【发布时间】:2013-12-27 21:40:42
【问题描述】:

我正在尝试使用“.hgt”格式文件中的二进制数据的应用程序。我在 C++ 中找到了一个解决方案,但我不知道如何将该解决方案转换为 C。文件中的每个值都是带符号的 short int 类型,并且有 1201x1201 个值。

const int SIZE = 1201;
signed short int matrix[SIZE][SIZE] = {0};

int main(int argc, const char * argv[])
{
    using namespace std;

    ifstream file("N49E013.hgt", ios::in|ios::binary);    

    unsigned char buffer[2];
    for (int i = 0; i < SIZE; ++i)
    {
        for (int j = 0; j < SIZE; ++j) 
        {
            if(!file.read( reinterpret_cast<char*>(buffer), sizeof(buffer) ))
            {
                cout << "Error reading file!" << endl;
                system("PAUSE");
                return -1;
            }
            matrix[i][j] = (buffer[0] << 8) | buffer[1];       
        }
    }

【问题讨论】:

    标签: c++ c


    【解决方案1】:

    主要是,您只需将std 方法替换为stdio.h 函数,如下所示:

    #include <stdio.h>
    
    #define SIZE 1201
    signed short int matrix[SIZE][SIZE] = {0};
    
    int main(int argc, const char * argv[])
    {
        FILE *fp = fopen("N49E013.hgt", "rb");    
    
        unsigned char buffer[2];
        for (int i = 0; i < SIZE; ++i)
        {
            for (int j = 0; j < SIZE; ++j) 
            {
                if (fread(buffer, sizeof(buffer), 1, fp) != 1)
                {
                    printf("Error reading file!\n");
                    system("PAUSE");
                    return -1;
                }
                matrix[i][j] = (buffer[0] << 8) | buffer[1];       
            }
        }
    
        fclose(fp);
    }
    

    【讨论】:

    • 顺便说一句,检查fread()是否成功的正确方法是fread(buffer, sizeof(buffer), 1, fp) &lt; 1
    • 感谢两位的帮助。
    • @H2CO3 实际上,错误或 eof 的返回值为 0,所以这只是一个旧(坏)习惯。但是你说得对,不等于 count 参数的返回值是记录在案的错误/eof 指示器。 +1 并相应地修复了代码。
    • @CareyGregory 谢谢!
    【解决方案2】:

    0) 在顶部

    #include

    1) 去掉内联声明,移到main(){

    之后的顶部

    2) 移除 using 命名空间

    3) 将 ifstream ... 替换为

    FILE* file = fopen("N49E013.hgt", "rb");
    

    4) 将 file.read... 替换为

    fread(buffer, 2, 1, file);
    

    5) 将 cout ... 替换为

    printf("Error reading file\n");
    

    6) 在循环的 } 之后,添加

    fclose(file);
    

    【讨论】:

      【解决方案3】:

      C 代码非常相似,你只需要使用 stdio.h 的 fopen 和 fread 来代替。

      请参阅此示例:http://www.codingunit.com/c-tutorial-binary-file-io

      【讨论】:

        猜你喜欢
        • 2018-01-21
        • 1970-01-01
        • 2019-12-03
        • 1970-01-01
        • 2023-03-13
        • 2013-04-24
        • 2021-09-07
        • 2010-09-26
        • 2017-10-01
        相关资源
        最近更新 更多