# Problem with while loop

**URL:** <https://www.ruby-forum.com/t/problem-with-while-loop/141025>\
**Category:** Ruby\
**Created:** [June 20, 2008, 9:35pm UTC](https://www.ruby-forum.com/t/problem-with-while-loop/141025 "2008-06-20T21:35:40Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [June 20, 2008, 9:35pm UTC](https://www.ruby-forum.com/t/problem-with-while-loop/141025/1 "2008-06-20T21:35:40Z")

</div>

Hi,

I’d greatly appreciate feedback on the following code.

def create\_files  
names\_array = self.read\_names #another method in my class

```
 while names_array.length != 0
   name = names_array.pop
   File.open( name, "w" ) { |f| f.puts "File is no longer empty" }
 end

```

x.create\_files

Which results in:

C:/Scripts/Ruby/file\_gen.rb:34:in `initialize': Invalid argument - echo (Errno ::EINVAL) from C:/Scripts/Ruby/file_gen.rb:34:in`open’  
from C:/Scripts/Ruby/file\_gen.rb:34:in `create\_files’  
from C:/Scripts/Ruby/file\_gen.rb:42

The array contains the strings ‘alpha’ through ‘foxtrot’ and before  
producing the error above the file ‘foxtrot’ is created. So the logic  
works once before failing.

When I pull this code out of the class definition it works perfectly  
and creates  
a file for every name in the array. What noob mistakes am I making?

Thanks,

S.

---

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [June 20, 2008, 10:02pm UTC](https://www.ruby-forum.com/t/problem-with-while-loop/141025/2 "2008-06-20T22:02:00Z")

</div>

On Friday 20 June 2008, removed\_email\_address@domain.invalid wrote:

> ```
> name = names_array.pop
> 
> ```
> 
> When I pull this code out of the class definition it works perfectly  
> and creates  
> a file for every name in the array. What noob mistakes am I making?
> 
> Thanks,
> 
> S.

To understand what’s going on, one should understand what the error  
Errno::EINVAL means. Unfortunately, the only explaination a very quick  
search  
returned is this:  
“Invalid argument. This is used to indicate various kinds of problems  
with  
passing the wrong argument to a library function.”

I don’t know what can be causing it. I tried passing non-string  
arguments to  
File.open, but I always got TypeError s, except when I tried passing an  
integer, which gave me an Errno::EBADF exception (I’m on linux, though,  
so  
maybe on windows that can give you another kind of error). At any rate,  
the  
first thing I’d try (maybe you’ve already done it) is to check that  
indeed the  
contents of names\_array is what you think it is, putting a  
p names\_array  
just after creating it.

If that doesn’t give you a clue, you can rewrite the code in a more  
rubysh  
way. If I understand correctly, you’re simply iterating on all the  
elements of  
the array and the while loop and calls to pop are simply there to know  
when to  
stop the loop. In this case, the whole while loop can be replaced by  
this:

array\_names.each do |n|  
File.open(n, “w”){|f| f.puts “File is no longer empty”}  
end

The substance of the code shouldn’t change (well, aside from the fact  
that the  
array won’t be empty at the end), but this should ensure there is no  
mistake  
in the logic of the loop (I can’t see any, but you never know).

Other than this, I don’t know what else to suggest.

I hope this helps

Stefano

---

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [June 20, 2008, 10:15pm UTC](https://www.ruby-forum.com/t/problem-with-while-loop/141025/3 "2008-06-20T22:15:30Z")

</div>

Hi Stefano,

Quoting Stefano C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> > ```
> > while names_array.length != 0
> > 
> > ```
> > 
> > (Errno
> 
> Errno::EINVAL means. Unfortunately, the only explaination a very quick search  
> returned is this:  
> “Invalid argument. This is used to indicate various kinds of problems with  
> passing the wrong argument to a library function.”

Firstly, thank you very much for the feedback. I did also look for  
more info on Ruby errors. Not much luck finding details on  
Errno::EINVAL.

> I don’t know what can be causing it. I tried passing non-string arguments to  
> File.open, but I always got TypeError s, except when I tried passing an  
> integer, which gave me an Errno::EBADF exception (I’m on linux, though, so  
> maybe on windows that can give you another kind of error). At any rate, the  
> first thing I’d try (maybe you’ve already done it) is to check that  
> indeed the contents of names\_array is what you think it is, putting a  
> p names\_array just after creating it.

I did replace ‘File.open( name, “w” ) { |f| f.puts “File is no longer  
empty” }’ with ‘puts name’ and ‘puts name.class’ just to make sure.  
Sure enough all the array elements are neatly popped out and they are  
strings.

> If that doesn’t give you a clue, you can rewrite the code in a more rubysh  
> way. If I understand correctly, you’re simply iterating on all the  
> elements of the array and the while loop and calls to pop are simply  
> there \> to know when to stop the loop. In this case, the whole  
> while loop can be \> replaced by this:

Your analysis of the code is correct.

> array\_names.each do |n|  
> File.open(n, “w”){|f| f.puts “File is no longer empty”}  
> end

I’ll try this.

> The substance of the code shouldn’t change (well, aside from the  
> fact that the array won’t be empty at the end), but this should  
> ensure \> there is no mistake in the logic of the loop (I  
> can’t see any, but you \> never know).
> 
> Other than this, I don’t know what else to suggest.
> 
> I hope this helps

Thanks again for you time and suggestions.

> Stefano

Regards,

S.

---

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [June 21, 2008, 12:48pm UTC](https://www.ruby-forum.com/t/problem-with-while-loop/141025/4 "2008-06-21T12:48:29Z")

</div>

unknown wrote:

> Just a quick update: a friend ran my entire code on Mac/Unix and it  
> worked perfectly. The problem appears to be Windows related…ughh.

I’d be highly suspicious of the file names, looking for things like  
trailing whitespace etc.

Also I’d try opening each file like this:

f = File.open(name, “w”)  
f.puts(“File is no longer empty”)  
f.fsync  
f.close

The fewer operations you do in one line the better from a debugging  
point of view. (The f.sync is to ensure that no buffering occurs, just  
in case.)

---

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [June 20, 2008, 10:22pm UTC](https://www.ruby-forum.com/t/problem-with-while-loop/141025/5 "2008-06-20T22:22:34Z")

</div>

Hi Stefano,

Just a quick update: a friend ran my entire code on Mac/Unix and it  
worked perfectly. The problem appears to be Windows related…ughh.

Thanks,

S.

Quoting Stefano C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

---

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [June 21, 2008, 11:48pm UTC](https://www.ruby-forum.com/t/problem-with-while-loop/141025/6 "2008-06-21T23:48:24Z")

</div>

Thanks Dave. I’ll give this a try. I almost choked when my friend told  
it ran without changes on OS X.

S.

Quoting Dave B. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):
