Я пытаюсь прочитать список биномов, разделенных строкой в файле, заданном в качестве аргумента командной строки. Файл выглядит так …
numbers.txt
2.1x+1
3x-5.3
-24.1x+24.7
0x-15.5
-12.3x+0
Ожидаемый результат:
input: 2.1x+1
real: 2.1
imag: +1
input: 3x-5.3
real: 3
imag: -5.3
input: -24.1x+24.7
real: -24.1
imag: +24.7
input: 0x-15.5
real: 0
imag: -15.5
input: -12.3x+0
real: -12.3
imag: +0
Мой вывод:
input: 2.1x+1
real: 2.1
imag: 2.07545e-317
input: 3x-5.3
real: 3
imag: 2.07545e-317
input: -24.1x+24.7
real: -24.1
imag: 2.07545e-317
input: 0x-15.5
real: -24.1
imag: 2.07545e-317
input: -12.3x+0
real: -12.3
imag: 2.07545e-317
Я имею с получением ‘реального’ значения двойной переменной правильно. sscanf () также не определяет начальное нулевое значение для одного из x-коэффициентов. Могу ли я что-то сделать с sscanf (), чтобы это исправить?
#include <iostream>
#include <istream>
#include <fstream>
#include <algorithm>
#include <sstream>
#include <vector>
using namespace std;
class binomial
{
public:
double real;
double imag;
string usercmplx;
};
int main(int argc, char* argv[]){
string word, input;
vector <binomial> VecNums;
binomial complexnum;
// Inializes vector to size for speedup
VecNums.reserve(1000);
ifstream file(argv[1]);
// Parse txt file line by line
while (file >> input) {
// handle empty lines
if (!input.empty()){
// Saves the user input format
complexnum.usercmplx = input;
// This seperates the input into the real and imaginary parts
sscanf(input.c_str(), "%lf %lf", &complexnum.real, &complexnum.imag);
cout << "input: " << input << endl;
cout << "real: " << complexnum.real << endl;
cout << "imag: " <<complexnum.imag << endl;
// Push binomials into Vector
VecNums.push_back(complexnum);
}
}
return 0;
}
sscanf(input.c_str(), "%lf %lf", &complexnum.real, &complexnum.imag);
это sscanf
состояние строки формата: вход содержит double
значение, за которым следует пробел, а затем еще один double
значение.
Вы предоставляете следующее input
:
2.1x+1
Вы видите здесь double
значение, за которым следует пробел, а другой double
значение? Конечно, нет. Первый double
значение сопровождается символом «х». Это не пробел.
Поскольку фактический ввод не соответствует ожидаемому вводу, sscanf()
не в состоянии проанализировать ввод и инициализировать возвращенные значения. Если вы проверите возвращаемое значение из sscanf()
, вы бы знали это.
Один из способов исправить это, это сказать sscanf()
что символ следует за двойным значением.
char char_value;
sscanf(input.c_str(), "%lf%c%lf", &complexnum.real, &char_value, &complexnum.imag);
Других решений пока нет …