我得到了一个文本文件,其中包含传感器的读数,例如:
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变量中。
答案 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:但是我们的课程尚未涵盖class
或struct
如果无法使用单个class
或struct
来建模数据,则必须使用 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;
}
}
请记住,保持您的编码和设计简单。复杂性会注入更多缺陷。