在C ++中解析双变量输入的.text文件

时间:2011-04-29 18:25:41

标签: c++ text-parsing

目前正在处理一个片段,用于输入用户更改文本文件以供日后使用的变量。将它们存储在一个数组中,然后在某些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();

现在它将数组中的所有值保存为已初始化但不会在以后覆盖它们,因为当我将这些行分解为标记时应该如此。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

在我看来,错误就在这里:

  

n [i] = strtod(strtok(buf,&#34 ;;"),NULL);

在第一次运行while循环时,strtok()将返回一个C字符串,如"某些东西= 18.0"。

然后strtod()会尝试将其转换为double,但字符串" something = 18.0"是不是很容易转换为双。你想要标记最初的"东西="首先,如果需要,可以将数据丢弃(或者如果你愿意,可以用它做一些事情)。

你可能想引用这个帖子来获得更多C ++风格的方法,以便对你的字符串进行标记,而不是像你当前正在使用的C风格:

How do I tokenize a string in 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() );
}