Steve
Steve

Reputation: 1459

Is this an acceptable way to determine EOF while reading a file in PHP?

I am fairly new to PHP and just trying to convert something I did in C. The idiom for reading from a file in C that I was taught was:

while ((c = getchar()) != EOF) {
    doSomethingWith(c);
}

I've done some reading and it would seem that the 'right' way to do this in PHP is:

while (!feof($file)) {
    $c = fgetc($file);
    doSomethingWith($c);
}

My question is: Is it ok to combine the two as follows (I have tried it, and its working ok on my test file), or are there situations where this could find a null before EOF?:

while (($c = fgets($f)) != null) {
    doSomethingWith($c);
}

Cheers in advance

Steve

Upvotes: 0

Views: 2425

Answers (2)

Jon
Jon

Reputation: 437554

fgets is documented to return false when there is no more data to read. Therefore, the technically correct solution would be

// Notice the !== [non-identical] operator below
while (($c = fgets($f)) !== false) {
    doSomethingWith($c);
}

This is better because fgets could legitimately return an empty (zero-length) string, which would compare equal to null when using the equality operator. The operator !== also checks the type of its operands, so this way you are covered.

Upvotes: 0

KingCrunch
KingCrunch

Reputation: 132011

It's ok, but the way you are doing it it's wrong (at least "not correct at all"). fgets() returns false, if the end of the file is reached, thus you should test against false instead. It works for you, because you use the "simple" equality operator (==), that will case null to false, when comparing against a boolean.

Returns a string of up to length - 1 bytes read from the file pointed to by handle. If there is no more data to read in the file pointer, then FALSE is returned.

If an error occurs, FALSE is returned.

This means, it have to look like

while (($c = fgets($f)) !== false) {
    doSomethingWith($c);
}

Upvotes: 2

Related Questions