如何将int类型数字/字母转换为char和* char?

时间:2020-11-08 11:15:35

标签: c++ c arduino arduino-ide

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

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

我要构建: char * mytest1包含第一个文本 char * mytest2包含第二个文本 包含第一个整数(2个数字)的int mytest3 int mytest4包含第二个整数(2个数字) int mytest5包含第三个整数(2个数字) 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();

}

2 个答案:

答案 0 :(得分:0)

file.read返回整数。这样就打印出了整数。

您将其转换为字符串。

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

答案 1 :(得分:0)

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

#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;
}
相关问题