我正在读取txt文件中的字符串,然后通过switch case将其与关键字列表(bubby,bonny,computer)匹配,然后初始化结构。但是我收到了以下错误。
+ _struct 0x00efb7b0 {g=<Error reading characters of string.> HL=-431602080. mg_i=-431602080. ...} D *
#include <iostream>
#include <stdio.h>
#include <ctime>
#include <windows.h>
#include <fstream>
#include <string>
using namespace std;
struct D
{
string g;
float HL, mg_i, mg_m, t;
float tau = HL / abs(log(0.5));
};
void scan(string, int&);
ifstream rlog;
ofstream wlog;
string line;
int main()
{
int ptr;
string month[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
//time_t t_i, t_f = time(0);
//tm *ltm = localtime(&t_f);
rlog.open("log.txt");
scan(" :", ptr);
string _list[3] = {"bubby", "bonny", "computer"};
int j = 0;
for (int i = 0; i < 2; i++){
if (line.find(_list[i]) < line.length()){
j++;
}
}
D *_struct = (D*)malloc(j*sizeof(D));
for (int i = 0; i < j; i++){
if (line.find(_list[i]) < line.length()){
switch (i){
case '1':
(_struct + i)->g = "bubby";
_struct[i].HL = 9.0;
_struct[i].mg_m = 150;
break;
case '2':
(_struct + i)->g = "bonny";
_struct[i].HL = 8.5;
_struct[i].mg_m = 450;
break;
case '3':
(_struct + i)->g = "computer";
_struct[i].HL = 48.755;
_struct[i].mg_m = 360;
break;
}
}
}
return 0;
}
void scan(string s, int &i)
{
while (!rlog.eof()){
getline(rlog, line); //READ IN
if (line.find(s) > line.length()){}
else{
i = line.find(s);
break;
} //EXIT FUNCT WEN FOUND
}
}
提前致谢
答案 0 :(得分:1)
你有一个严重的问题:
D *_struct = (D*)malloc(j*sizeof(D));
malloc
函数只分配内存,它不调用结构和类的构造函数,这意味着std::string
成员D::g
将无法正确构造。
在C ++中,你几乎不应该直接使用malloc
,当你想动态分配内存时应该使用new
,或者在分配数组new[]
时:
D* _struct = new D[j];
更好的解决方案是使用std::vector
:
std::vector<D> _struct(j);
然后当然有switch
语句的问题,或者更确切地说是它的情况。字符文字'1'
实际上与ASCII encoding中的整数49
相同。你不应该在这里使用字符文字而是整数文字,所以改变例如'1'
至1
。