【问题标题】:How to convert int type number/letter to char and *char?如何将 int 类型的数字/字母转换为 char 和 *char?
【发布时间】:2020-11-08 11:15:35
【问题描述】:

我在 arduino IDE 上使用 LittleFS 库和 ESP32。 我正在使用 LittleFS 的示例 readFile 函数读取文件,但我正在尝试根据需要对其进行转换。 写入文件的文本格式如下: LettersAndNumbersMax30&LettersAndNumbersMax30&00&00&01&01

由 & 分隔。 2 个文本值,最多 30 个字符和 4 个整数。

我想构建: char *mytest1 包含第一个文本 char *mytest2 包含第二个文本 int mytest3 包含第一个整数(2digits) int mytest4 包含第二个整数(2digits) int mytest5 包含第三个整数(2digits) int mytest5 包含第四个整数(2位)

file.read() 总是返回整数。例如 38 表示 &。

void readFile(fs::FS &fs, const char * path){
Serial.printf("Reading file: %s\r\n", path);

File file = fs.open(path);
if(!file || file.isDirectory()){
    Serial.println("- failed to open file for reading");
    return;
}

Serial.println("- read from file:");
while(file.available()){
    Serial.write(file.read());
  
}
file.close();

}

【问题讨论】:

    标签: c++ c arduino arduino-ide


    【解决方案1】:

    file.read 返回整数。所以整数被打印出来了。

    你把它转换成字符串。

    while(file.available()){
        char s[2] = {0};
        s[0] = file.read();
        Serial.write(s);
    }
    

    【讨论】:

    • 那么如果我有一个 char * myvar 可以使用 strncpy(myvar,s) 吗?
    【解决方案2】:

    它相当简单。测试读取的每个字节并采取相应措施。下面的代码不处理符号或负数。它也不检查文件中是否只有整数的数字。

    #include ....
    
    struct record_t
    {
       char myState1[31]; 
       char myState2[31]; 
       int  myState3;
       int  myState4;
       int  myState5;
       int  myState6;
    };
    
    record_t record;
    
    bool readFile(fs::FS &fs, const char * path);
    
    void setup()
    {
        // ... 
    }
    
    void loop()
    {
        //...
        if (readFile(/*...*/))
        {
            Serial.printf("file reads OK\r\n");
            //...
        }
    }
    
    bool readFile(fs::FS &fs, const char * path)
    {
        Serial.printf("Reading file: %s\r\n", path);
    
        File file = fs.open(path);
    
        if (!file || file.isDirectory())
        {
            Serial.println("- failed to open file for reading");
            return;
        }
    
        Serial.println("- read from file:");
        int state = 0;
        int index = 0;
    
        // clear record.
        record.myState1[0] = 0;
        record.myState2[0] = 0;
        record.myState3 = 0;
        record.myState4 = 0;
        record.myState5 = 0;
        record.myState6 = 0;
     
        bool valid = false;
        for (int i = file.read(); i != -1; i = file.read())
        {
            char c = i & 0xFF; 
            Serial.write(c);    // file.read() returns an int, that's why     Serial.write()
                                //  was printing numbers.
    
            switch(state)
            {
            case 0:
                if (index > sizeof(record.myState1) - 1) // avoid buffer overflow
                    index = sizeof(record.myState1) - 1;
                if (c != '&')
                {
                    record.myState1[index++] = c;
                }
                else
                {
                    record.myState1[index] = 0;
                    ++state;
                    index = 0;
                }
                break;
    
            case 1:
                if (index > sizeof(record.myState2) - 1) // avoid buffer overflow
                    index = sizeof(record.myState2) - 1;
                if (c != '&')
                {
                    record.myState2[index++] = c;
                }
                else
                {
                    record.myState2[index] = 0;
                    ++state;
                    index = 0;
                }
                break;
    
            case 2:
                if (c != '&')
                     record.myState3 = record.myState3 * 10 + (c - '0');
                else
                     ++state;
                break;
    
            case 3:
                if (c != '&')
                    record.myState4 = record.myState4 * 10 + (c - '0');
                else
                    ++state;
                break;
    
            case 4:
                if (c != '&')
                    record.myState5 = record.myState5 * 10 + (c - '0');
                else
                    ++state;
                break;
    
            case 5:
                valid = true;
                if (c != '&')
                    record.myState6 = record.myState6 * 10 + (c - '0');
                else
                    ++state;
                break;
    
            default:  // reaching here is an error condition?  You decide.
                return false;
            }
        }
        file.close();
    
        if (!valid)
        {
            // clear record.
            record.myState1[0] = 0;
            record.myState2[0] = 0;
            record.myState3 = 0;
            record.myState4 = 0;
            record.myState5 = 0;
            record.myState6 = 0;
        }
        return valid;
    }
    

    【讨论】:

    • 谢谢你,但我需要调用一个类的函数,它接受前两个 *char 和最后 4 个整数。我应该转换(如果是,如何转换?) char mytest1 和 char mytest2 到 char * ?还是我们应该更改代码以使它们从 char * 开始,以便我可以调用另一个函数?
    • 一个 char 数组将自动衰减为 char*... 这使得调用函数的语法非常简单:YourFunction(record.myTest1); 。您确实需要将字符串存储在某处,并且它必须有一个终止 NULL 字节,
    • 所以我们必须把 '\0' 只放到 char* 而不是 char 数组 (char xxx[100])
    • 我将 myState 更改为 mytest 因为它无法编译并且 case1;案例1:但是我无法编译它。我把卡住的记录和record_t记录放在setup()之前,我#include包含readFile的functions.h但它说:退出状态1'记录'没有在这个范围内声明
    • 声明必须按照正确的顺序来遵守。并且记录必须是一个全局变量。
    猜你喜欢
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多