Leigh Omar Alpha Ответов: 2

Чтение всех данных во входном текстовом файле на языке C++


я написал код, чтобы взять все выражения во входном текстовом файле и вычислить их. Но проблема в том, что он вычисляет только первые выражения. А также если я включу --------- в текстовый файл, чтобы отделить выражение, это даст мне ошибку компилятора.

Что я уже пробовал:

int main ()
{
   string inputLine;
   ifstream file ("input.txt");
   {
       while (std::getline (file, inputLine))
       {     
           while(!file.eof())
           {
               spaces
               file.ignore(1,'\n');
               inputLine = trim (removeBackspaces (inputLine));
               Parser p (inputLine);
               double value = p.Evaluate ();
               ofstream file;
               file.open("output.txt");
               file <<std::cout << "Result = " << value << std::endl;
               double abc = p ["abc"];
               file<<std::cout << "abc = " << abc << std::endl;
               file<<std::cout<<"----------------------"<<endl;
           }
       } 
       file.close();
    }
}

И это файл input.txt
----
грех(0)
----
cos(0)
----
pi = 3,14 радиус = 3 sin( pi / 2 ) + pi * радиус ^ 2
----
1 + 2
----
10 - 5
----
3 * 4
----
12 / 4
------------
2 ^ 3

2 Ответов

Рейтинг:
2

KarstenK

Вы должны использовать отладчик, чтобы найти свою ошибку. Для меня это выглядит так, как будто вы должны изменить первый цикл while heads для начала.


Рейтинг:
1

Rick York

Во-первых, вы должны переместить объявление объекта выходного файла за пределы цикла while. Вам не нужно создавать его и открывать файл для каждой строки, которую Вы читаете из входного файла. Он должен быть построен один раз и оставлен открытым, пока вы читаете входные данные.

Линия только с "пробелами" неясна. Это, скорее всего, вызовет ошибку компиляции.

Еще одна вещь, эта строка, скорее всего, также вызовет ошибку компиляции :

double abc = p ["abc"];
Это выглядит подозрительно, но трудно понять, не видя определения класса синтаксического анализатора.


Leigh Omar Alpha

большое вам спасибо, Рик Йорк, теперь он прочитал все строки . у меня тоже есть проблема, когда я представил --------- в отдельной линии, это дает мне ошибку компилятора.пожалуйста, если вы можете помочь мне найти способ, что компилятор пропустит этот--------- и только recongnizes выражения.

Rick York

Это не проблема компилятора. Это логическая проблема. Попробуйте сравнить вашу входную строку с "- - - - " - используя сравнение с ограниченной длиной. В мире C будет использоваться функция strncmp. Я не знаю, каков будет соответствующий метод сравнения std::string, но это то, что вы должны использовать. Вы можете использовать strncmp и передать его inputLine.c_str (), если хотите. Код будет выглядеть следующим образом:

           inputLine = trim (removeBackspaces (inputLine));
           if( strncmp( "----", inputLine.c_str(), 4 ) == 0 )
               continue;     // don't process this one - read another

Rick York

Еще одна вещь, второе утверждение while должно быть if. Что-то вроде этого :

    if( file.eof() )
        break;
Вообще-то, на вашем месте я бы просто прокомментировал эту строчку для начала. Если getline терпит неудачу, это означает, что вы находитесь в конце файла, поэтому дополнительная проверка не требуется. Дело в том, что я все время пишу Парсеры файлов и никогда не проверял EoF. Я всегда использую fgets (C-эквивалент getline) и цикл до тех пор, пока он не выйдет из строя для разбора строк. Для символьного синтаксического анализа я читаю по одному символу за раз до отказа. Я никогда не видел необходимости проверять наличие EoF.

Leigh Omar Alpha

кроме того, когда у меня есть выражение, которое имеет двоичный и шестнадцатеричный вид
----
Пи = 3,14
радиус = 3
sin( pi / 2 ) + pi * radius ^ 2 + 0x1F - 1100b
он будет отмечать calculte из-за двоичных и шестнадцатеричных значений.
я хочу, чтобы входной файл распознавал двоичные и шестнадцатеричные числа и преобразовывал их в десятичные или целочисленные, чтобы мое выражение было вычислено . это сейчас моя главная проблема.