tags:

views:

136

answers:

5

I'm using the fgets function to read a line from a file. I don't understand how to ignore the leading whitespace of a file though. I thought if I had a char array I could check the first value to see if it is whitespace with isspace, and then increment to the next value. My code looks like:

while (!feof(fp)) {
        fgets(str, LINE_SIZE, fp);
        while (isspace(*str)) {     // need help 
            str + 1;        // here
        }


        for (cp = str; cp = strtok(cp, "AEIOUaeiou\n"); cp = NULL) {
            puts(cp);
        }
    }
}

Thanks!

A: 

You should use

str = str+1;

which can be shorten to

str += 1;

or even better

++ str;

in // here to update the pointer str.

KennyTM
+1  A: 

the value of str was not modified. try to change

str+1;

to

str++;
Pierre
+4  A: 

what you want is something like

while (!feof(fp)) {
        fgets(str, LINE_SIZE, fp);
        char * tmp = str; //use a temporary variable so str pointer isn't overwritten
        while (*tmp && isspace(*tmp)) {     // need help 
           tmp++;        // here
        }


        for (cp = tmp; cp = strtok(cp, "AEIOUaeiou\n"); cp = NULL) {
            puts(cp);
        }
    }
}
Charles Ma
Crystal
@Crystal: if `tmp` is all spaces, then the loop will get to the end of the string - the test for `*tmp` ends the loop when it reaches that point instead of running past the end into undefined memory.
Michael Burr
@Michael: but '\0' is not a space character, so this test is unnecessary.
unwind
@unwind: nice. @Charles: +1 for a good answer. This code reads the last line twice, btw.
Alok
@unwind: true enough. Didn't occur to me.
Michael Burr
A: 

Your code has some issues:

Most of the times, you don't want to do the check feof(fp) at the top of a loop when reading a file. It is almost guaranteed that if you do so, you will read the last line of the file twice. This is because feof() returns true only if an earlier read attempt resulted in "end of file". Better method is to check if fgets() returns NULL:

while (fgets(str, LINE_SIZE, fp) != NULL) {
    /* do your processing */
}
if (ferror(fp)) { /* there was an error reading some data */ }

Your isspace() call should cast *str to unsigned char if it is not of that type:

while (isspace((unsigned char)(*str))) {

To use isspace(), you should #include <ctype.h>.


You need to increment str. Your expression str+1 evaluates str+1, discards its value, and does nothing. So, you need:

++str;

But you don't want to increment str: you need that for the next fgets() call. So, you should copy it to a temporary pointer:

char *tmp = str;
while (isspace((unsigned char)(*tmp))) {
    ++tmp;
}

Making all the changes above, your loop becomes:

while (fgets(str, LINE_SIZE, fp) != NULL) {
    char *tmp = str;
    while (isspace((unsigned char)(*tmp)))
        ++tmp;

    for (cp = tmp; cp = strtok(cp, "AEIOUaeiou\n"); cp = NULL) {
        puts(cp);
    }
}

(You have an extra closing }, most likely a copy-paste error.)

Alok
A: 

To add to Kenny and Piere since they have mentioned str++ and ++str, the difference between the two is which version of str will be used in the expression.

For example

int y=1;
x[y++]=10;     //1
and x[++y]=10; //2

in //1 index 1 is used and x[1] is assigned 10 and after that y is 2 and in //2 x[2]=10 meaning that y was incremented before it was used as an index.

Generally you want to use ++value everywhere. However as I have illustrated value++ has its uses.

Hassan Syed