Home > front end >  How to remove hidden line breaks from TXT file in C?
How to remove hidden line breaks from TXT file in C?

Time:11-25

I'm attempting to grab each line from a TXT file and then pass that line into variables, which I will match up in an if statement. My txt file is:

add $t0, $t1, $t2
addi $t0, $t1, 30352

It properly removes the commas and sends "add", "$t0", "$t1", "$t2" to their respective variables and then translates them to the binary representation using if statements. It works for every variable except for $t2 because there is some kind of hidden line break that I cannot for the life of me figure out how to remove. My if statement looks like

else if(strcmp("$t2", reg) == 0)
{
 return r10;
}

which should be returning 01010 but instead never evaluates true.

How can I cleanse this of the line break in C?

Update: Here's how I'm reading the file

FILE *fp;
char * line = NULL;
size_t len = 0;
ssize_t read;

void sendLine()
{

//Open file, check it's not empty
fp = fopen("mymipsfile.txt", "r");
if (fp == NULL)
{
        exit(EXIT_FAILURE);
}

while ((read = getline(&line, &len, fp)) != -1) {
        printf("Retrieved line of length %zu:\n", read);
        printf("%s", line);
        remove_all_chars(line, ',');
        interpertLine(line);
        decodeLine(0);
        printf("\n");
}

fclose(fp);
if (line)
{
    free(line);
}
exit(EXIT_SUCCESS);
}

And here is how im splitting it into the variables

void interpertLine(char currentLine[])
{
   //Extract the first token
   char * token = strtok(currentLine, " ");
   op = token;
   //Loop through the string to extract all other tokens
   int i = 0;
   while( token != NULL ) {
      //printf( " %s\n", token ); //printing each token
      token = strtok(NULL, " ");
      if(i == 0)
      {
          rs = token;
      }
      else if (i == 1)
      {
          rt = token;
      }
      else if (i == 2)
      {
          rd = token;
      }
      i  ;
   }
}

CodePudding user response:

Simply limit the comparing length to visible characters only:

else if (strncmp("$t2", reg, sizeof("$t2") - 1) == 0)
{
  return r10;
}

Note1: I'm using 'sizeof() - 1' to prevent comparison the trailing null termination byte (0), existing on the end of each string literal "...."

Note2: My solution will generate 'false positives' if 'reg' points to any string beginning with "$t2", for example: "$t20", "$t2abc" etc. So, the better way is replacing the first invisible character to 0, then compare full size like below:

char *tmp_reg = reg;
while (tmp_reg  )
{
  if (tmp_reg < ' ') // is invisible?
  {
    *tmp_reg = 0; // replace invisible to 0
    break; // we don't need to compare more
  }
}

// ....

else if (strcmp("$t2", reg)) == 0)
{
  return r10;
}
  • Related