如何将纺织品中的特定线条读入变量

时间:2018-09-02 20:40:30

标签: c++

我得到了一个文本文件,其中包含传感器的读数,例如:
Temp1,17.8
Temp2,17.9
Temp1,18.1
Temp2,18.2

如何将数值存储到变量中?

我尝试了很多事情,但是无法正常工作。

#include <sstream> 
#include <cstdlib> 
#include <iostream> 
#include <fstream> 
#include <cstring> 


using namespace std;

 double sumOfTemp;

int main ()
{
    string filename;
    string buffer;
    string temp;
    char apple;
    char temp1[10000];
    char temp2[10000];
    double arr1[10000];
    double arr2[10000];

    int lineRead=0; //counter for number of lines read;

    cout<<"Please enter a file: ";
    cin>>filename;

    ifstream infile(filename.c_str());
    cout<<"before loop"<<endl;
    while(infile.get(apple));
    {
        cout<<"beginning of loop"<<endl;
        getline(infile,buffer);
        int size=0;
        size=buffer.length();
        bool delFound=false;
        for(int i =0; i<size; i++)
        {
            if (buffer[i]==',')
            {
                delFound=true;
            }
            if(delFound)
            {
                temp.append(buffer[i]);
            }
        }
        cout<<"end of loop"<<endl;
        cout<<"Temp value"<<temp<<endl;
    }
    cout<<"out of loop"<<endl;

}

这是我到目前为止所拥有的,但是我100%肯定必须有一个更简单的方法。

我打算做的最终结果: 编写一个计算平均温度的C ++程序 根据两个IoT传感器的数据在一个房间内放置一段时间。

您的程序应首先请求温度文本文件的名称。提供了一个文本文件,其中包含许多已发送的传感器消息, 每行代表一个不同的消息。每条消息均包含传感器名称和 用逗号分隔的温度值。该程序应阅读 温度数据转换为合适的数据结构。传感器1的温度应 然后由父流程添加到全局总和中,而子流程应 生成以将传感器2的温度添加到相同的全局总和中。后 所有温度样品均已处理,平均温度应为 通过将总和除以样本数来计算和打印。假设 指定的文本文件与您的程序位于同一目录中。平均 温度值应格式化为两位小数。

我已将代码更改为此:

int main ()
{
    string filename;
    string buffer;
    string temp;
    char apple;
    char temp1[10000];
    //char temp2[10000];
    //double arr1[10000];
    //double arr2[10000];

    int lineRead=0; //counter for number of lines read;

    cout<<"Please enter a file: ";
    cin>>filename;

    ifstream infile(filename.c_str());
    cout<<"before loop"<<endl;
    while(infile.get(apple));
    {
        cout<<"beginning of loop"<<endl;

        getline(infile, buffer, ',');
        infile >> temp1;
        // Just in case:
        infile.ignore(10000, '\n');

        getline(infile, buffer, ',');
        infile >> temp1;
        // Just in case:
        infile.ignore(10000, '\n');

        cout<<"end of loop"<<endl;
        cout<<"Temp value"<<temp1<<endl;
    }
    cout<<"out of loop"<<endl;





}

但是它仍然没有保存到temp1变量中。

1 个答案:

答案 0 :(得分:2)

给定可以包含记录的输入时,我创建一个类来对记录进行建模:

class Record
{
  public:
    std::string  source_name;
    double       temperature;
};

下一步是使operator>>重载以输入记录:

class Record
{
   //...
   public:  
      friend std::istream& operator>>(std::istream& input, Record& r);
};
std::istream& operator>>(std::istream& input, Record& r)
{
    std::getline(input, r.source_name, ',');
    input >> r.temperature;
    // Just in case:
    input.ignore(10000, '\n');
    return input;
}

在定义了Record数据结构之后,下一步是将数据读入数据库

std::vector<Record> database;
Record r;
while (input_file >> r)
{
    database.push_back(r);
}

这时,所有数据都在数据库中。 您可以访问数据库中的数据:

double temp1_sum = 0.0;
double temp2_sum = 0.0;
const size_t database_size = database.size();
for (size_t i = 0; i < database_size; ++i)
{
    if (database[i].source_name == "Temp1")
    {
        temp1_sum += database[i].temperature;
    }
    if (database[i].source_name == "Temp2")
    {
        temp2_sum += database[i].temperature;
    }
}

使用上述搜索数据库的技术,您可以执行诸如计算平均温度,查找最低或最高温度等操作。

如果输入法无效,则调整operator>>()方法以正确读取。阅读后,您可能希望将源字段转换为全部小写或全部大写。

编辑1:但是我不能使用std::vector

如果不允许您的编程类使用std::vector,则必须使用动态数组并动态调整容量。或者,您可以希望输入文件包含的元素少于声明的容量。

const size_t DATABASE_CAPACITY = 1000;
Record database[DATABASE_CAPACITY];
size_t database_size = 0;
Record r;
while (input_file >> r)
{
  if (database_size < DATABASE_CAPACITY)
  {
    database[database_size] = r;
    ++database_size;
  }
  else
  {
     std::cerr << "Database capacity, " << DATABASE_CAPACITY << " exceeded\n";
     break;
  }
}

这时,变量database_size将包含数据库中的记录数量。

编辑2:但是我们的课程尚未涵盖classstruct

如果无法使用单个classstruct来建模数据,则必须使用 parallel 数组。并行阵列的一个缺点是数据可能无法同步。

size_t DATABASE_CAPACITY = 512;
std::string database_source_names[DATABASE_CAPACITY];
double      database_temperatures[DATABASE_CAPACITY];
size_t      database_size = 0;
std::string name;
while (std::getline(input_file, name, ','))
{
  double temperature;
  input_file >> temperature;
  if (database_size < DATABASE_CAPACITY)
  {
    database_source_names[database_size] = name;
    database_temperatures[database_size] = temperature;
    ++database_size;
  }
  else
  {
    std::cerr << "Database capacity of " << DATABASE_CAPACITY << " exceeded.\n";
    break;
  }
}

请记住,保持您的编码和设计简单。复杂性会注入更多缺陷。