目前正在处理一个片段,用于输入用户更改文本文件以供日后使用的变量。将它们存储在一个数组中,然后在某些openGL中引用它们。
输入文本文件看起来像这样。
某事= 18.0;
别的东西= 23.4;
...总共6行
//the variable of type ifstream:
ifstream patientInput(".../Patient1.txt");
double n[6]= {0.0,0.0,0.0,0.0,0.0,0.0};
register int i=0;
string line;
//check to see if the file is opened:
if (patientInput) printf("Patient File Successfully Opened.\n");
else printf("Unable to open patient file\n");
while(!patientInput.eof())
{
getline(patientInput,line);
char *ptr, *buf;
buf = new char[line.size() + 1];
strcpy(buf, line.c_str());
n[i]=strtod(strtok(buf, ";"), NULL);
printf("%f\n",n[i]);
i++;
}
//close the stream:
patientInput.close();
现在它将数组中的所有值保存为已初始化但不会在以后覆盖它们,因为当我将这些行分解为标记时应该如此。任何帮助表示赞赏。
答案 0 :(得分:1)
在我看来,错误就在这里:
n [i] = strtod(strtok(buf,&#34 ;;"),NULL);
在第一次运行while循环时,strtok()将返回一个C字符串,如"某些东西= 18.0"。
然后strtod()会尝试将其转换为double,但字符串" something = 18.0"是不是很容易转换为双。你想要标记最初的"东西="首先,如果需要,可以将数据丢弃(或者如果你愿意,可以用它做一些事情)。
你可能想引用这个帖子来获得更多C ++风格的方法,以便对你的字符串进行标记,而不是像你当前正在使用的C风格:
祝你好运!答案 1 :(得分:0)
要应用NattyBumppo所说的只需更改:
n[i]=strtod(strtok(buf, ";"), NULL);
为:
strtok(buf," =");
n[i] = strtod(strtok(NULL, " ;"), NULL);
delete buf;
当然,如果没有strtok,还有很多其他方法可以做到。
以下是一个例子:
ifstream input;
input.open("temp.txt", ios::in);
if( !input.good() )
cout << "input not opened successfully";
while( !input.eof() )
{
double n = -1;
while( input.get() != '=' && !input.eof() );
input >> n;
if( input.good() )
cout << n << endl;
else
input.clear();
while( input.get() != '\n' && !input.eof() );
}