Попытка сделать условный форл oop при чтении из файла - PullRequest
0 голосов
/ 05 апреля 2020

Я пытаюсь создать for l oop с условным оператором, который читает, пока не будет найдена операция, напр. (+, -, /, *), но при каждой попытке я получаю сообщение об ошибке:

Необработанное исключение в 0x7936F2F6 (ucrtbased.dll) в CIS310 Project 44.exe: был передан недопустимый параметр к функции, которая считает неверные параметры фатальными.

while (getline(infile, hex))
{
    n = hex.length();//find the length of the line
    for (i = 0; hex[i] != '/'||'+'||'-'||'*'; i++,++k) //loop to split the first hexadecimal number
        h1 = h1 + hex[i];
    for (i++; i < n - 1; i++) //loop to get the second hexadecimal number
        h2 = h2 + hex[i];
    n1 = convertDecimal(h1); //convert the first hexadecimal number to decimal
    n2 = convertDecimal(h2);

Ответы [ 3 ]

3 голосов
/ 05 апреля 2020

Ваше состояние hex[i] != '/'||'+'||'-'||'*' повреждено. C ++ требует, чтобы вы указывали обе стороны оператора каждый раз, поэтому вам потребуется нечто более похожее на hex[i] != '/' || hex[i] != '+' || ....

1 голос
/ 05 апреля 2020

Этот код похож на то, что вы написали:

while(getline(file,line))
{
    string firstPart = "";
    unsigned int i;
    //We can use the algorithm library to search for them but its ok
    for(i=0;(line[i] != '+') || (line[i] != '-') || (line[i] != '*') || (line[i] != '/') || (line[i] != '\0');i++  );
    firstPart = line.substr(0,i);
}

Теперь, если вы попробовали это, это вызовет ту же ошибку (или, по крайней мере, похожую на нее), если мы даже попытаемся напечатать каждый символ в l oop

for(/*stuff*/)
cout << line[i];

Затем обратите внимание, что это станет бесконечным l oop, проблема в том, что вы проверяете строку символов [i], если она не была + или - или * или / все одновременно, исправьте это, изменив || к &&. Я предполагаю, что ваш файл (с именем testfile.txt) имеет содержимое ниже:

0xAB+0xCD
0x11-0x03

Пример рабочего кода:

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main()
{
    ifstream file("testfile.txt");
    ///Don't forget to check if file has opened
    if(!file.is_open())
    {
        cout << "File didn\'t open :(";
        return 0;
    }
    string line;
    while(getline(file,line))
    {
        string firstPart = "",secondPart = "";
        char operation;
        unsigned int i;
        //We can use the algorithm library to search for them but its ok
        for(i=0;(line[i] != '+') && (line[i] != '-') && (line[i] != '*') && (line[i] != '/') && (line[i] != '\0');i++  );
        firstPart = line.substr(0,i);
        operation = line[i];
        secondPart = line.substr(i+1,firstPart.size());
    }
    file.close();
    return 0;
}
1 голос
/ 05 апреля 2020

Вы должны проверять после каждого '| | '(ИЛИ), как:

 hex[i] != '/' || hex[i] != '+' || hex[i] != '-' || hex[i] != '*'
...