Hydecide
Hydecide

Reputation: 1

Trying to make a conditional forloop when reading from a file

I am trying to create a for loop that has a conditional statement which reads until an operation is found, ex. (+,-,/,*), but every time I try I get an error:

Unhandled exception at 0x7936F2F6 (ucrtbased.dll) in CIS310 Project 44.exe: An invalid parameter was passed to a function that considers invalid parameters fatal.

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);

Upvotes: 0

Views: 68

Answers (3)

aliberro
aliberro

Reputation: 540

This is a similar code to what you wrote:

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);
}

now if you tried this, it will cause the same error (or atleast similar to it), if we even try to print every character in the loop

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

Then notice this will become an infinite loop, the problem is that you're checking the character line[i] if it wasn't a + or - or * or / all at the same time, fix this by changing the || to &&. I'll suppose that your file (named testfile.txt) has the content below:

0xAB+0xCD
0x11-0x03

Sample working code:

#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;
}

Upvotes: 1

yohoo
yohoo

Reputation: 195

You have to check after every ' | | '(OR), like:

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

Upvotes: 1

Shaavin
Shaavin

Reputation: 137

Your condition hex[i] != '/'||'+'||'-'||'*' is malformed. C++ requires that you specify both sides of the operator each time, so you will need something more similar to hex[i] != '/' || hex[i] != '+' || ....

Upvotes: 3

Related Questions