【问题标题】:Unexpected variable values reading from file (ESP32)从文件中读取的意外变量值 (ESP32)
【发布时间】:2021-02-20 19:46:58
【问题描述】:

我还在学习Cpp,如果我在这里理解有误,请指教。

使用 ESP32,我正在尝试将文件读/写到 Flash/FFat。这是我创建的方法,它应该从闪存中读取文件并将其加载到 PSRAM 中:

unsigned char* storage_read(char* path) {

    File file = FFat.open(path);
    if(!file) {
        Serial.println("no file");
        return 0x00;
    }

    int count = file.size();
    unsigned char* buffer = (unsigned char*)ps_malloc(count);

    Serial.printf("Bytes: %d\n", count);
    Serial.printf("Count: %d\n", sizeof(buffer));

    for (int i = 0; i < count; i++) {
        buffer[i] = (unsigned char)file.read();
    }

    file.close();
    return buffer;
}

问题是我得到了我的 b64 数据文件的内容,并在末尾添加了几个额外的数据字节。

调用方法:

Serial.printf("Got: %s", storage_read("/frame/testframe-000.b64"));

我得到了输出:

字节:684
数量:4
得到: +

为什么 sizeof 不能返回正确的尺寸?

将这个字符串加载到缓冲区中的正确方法是什么?

【问题讨论】:

    标签: c++ c arduino esp32 arduino-ide


    【解决方案1】:

    为什么 sizeof 不能返回正确的大小?

    那是因为sizeof() 有一个非常具体的功能(不是很直观)。它用于 - 编译时 - 查询传递给它的数据类型的大小。调用sizeof(buffer) 返回变量buffer 类型的大小(以字节为单位)。这是一个unsigned char*,所以是一个4字节的内存地址。所以这就是你得到的。

    将这个字符串加载到缓冲区中的正确方法是什么?

    我注意到您希望从文件中加载字符串数据,但您没有明确地用零字节终止它。您可能知道,所有 C 字符串都必须以零字节结尾。您从文件中加载的数据很可能没有(除非您在保存时特别注意添加它)。因此,当您从一个大小为 N 字节的文件中读取字符串时,分配一个 N+1 字节的缓冲区,将文件加载到其中并以零终止。像这样的:

    unsigned char* storage_read(char* path) {
        File file = FFat.open(path);
        if(!file) {
            Serial.println("no file");
            return 0x00;
        }
        int count = file.size();
        unsigned char* buffer = (unsigned char*)ps_malloc(count + 1); //< Updated
    
        Serial.printf("Bytes: %d\n", count);
        Serial.printf("Count: %d\n", sizeof(buffer));
    
        for (int i = 0; i < count; i++) {
            buffer[i] = (unsigned char)file.read();
        }
        buffer[count] = 0; //< Added
    
        file.close();
        return buffer;
    }
    

    而且由于您要从函数返回一个堆分配的缓冲区,因此请特别注意记住在完成后在调用者中删除它。您代码中的这一行将泄漏内存:

    Serial.printf("Got: %s", storage_read("/frame/testframe-000.b64"));
    

    【讨论】:

    • 啊该死的,我尝试了额外的字节,但没有自己终止它。现在似乎工作正常!也很高兴了解 sizeof,非常感谢!
    猜你喜欢
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    相关资源
    最近更新 更多