Разбор файла .txt для ввода двойной переменной в C ++ - PullRequest
1 голос
/ 29 апреля 2011

В настоящее время работает над фрагментом для ввода переменных, в которых пользователь изменяет текстовый файл для последующего использования.Хранить их в массиве, а затем ссылаться на них для некоторого 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 ]

1 голос
/ 29 апреля 2011

Мне кажется, что ошибка здесь:

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

При первом запуске цикла while функция strtok () вернет строку C, например "нечто = 18.0".

И тогда strtod () попытается преобразовать это значение в двойное, но строка «что-то = 18.0» не так легко преобразовать в двойное. Сначала вы захотите токенизировать исходное «что-то =» и выбросить эти данные, если это необходимо (или что-то сделать с этим, если хотите).

Возможно, вы захотите обратиться к этой теме, чтобы получить идеи для еще нескольких способов токенизации вашей строки в стиле C ++ вместо стиля C, как вы сейчас используете:

Как токенизировать строку в C ++?

Удачи!

0 голосов
/ 30 апреля 2011

Чтобы применить то, что сказал 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() );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...