Problem reading small files - stringio problem?

S

Singeo

Hi, I wonder if someone can take a quick look at this code and tell me
where I'm going wrong. The small files (less than 20k?) that I read in
this array are not appearing in the output file. I understand this is
a problem to do with stringio but have not found a way to fix it.
Thanks.

letters=("A".."Z").to_a
link_array = []

for index in (0...letters.length)
dummy = letters[index] + ".html"
link_array << dummy
end

open('sample.txt','w')
for index in (0...link_array.length)
guide=File.open(link_array[index], "r+")
html = guide.read
open('sample.txt','a') do |f|
f.puts guide
end
end
 
M

Martin Boese

I think your problem is: open('sample.txt', 'w'). You either open a file for
append or write, but not both. Remove this line and it might work.

Shorter also might be:

File.open('sample.txt', 'a') do |out|
('A'..'Z').each do |c|
out.puts File.open("#{c}.html", 'r').read
end
end


martin
 
R

Robert Klemme

2008/5/27 Singeo said:
Hi, I wonder if someone can take a quick look at this code and tell me
where I'm going wrong. The small files (less than 20k?) that I read in
this array are not appearing in the output file. I understand this is
a problem to do with stringio but have not found a way to fix it.
Thanks.

letters=("A".."Z").to_a
link_array = []

for index in (0...letters.length)
dummy = letters[index] + ".html"
link_array << dummy
end

open('sample.txt','w')
for index in (0...link_array.length)
guide=File.open(link_array[index], "r+")
html = guide.read
open('sample.txt','a') do |f|
f.puts guide
end
end

This has nothing to do with StringIO. You do not close all your file
descriptors properly. You should make it a habit to use the block
form of File.open.

Note also that you can use ("A" .. "Z") directly for iterating. Also,
it does not make sense to open and close "sample.txt" all the time.
Also, why do you write the IO object to the file and not the content?
It seems your code can be achieved by doing this:

File.open("sample.txt", "a") do |out|
for ch in "A".."Z"
out.write(File.read(ch + ".html"))
end
end

If your files are larger, you should copy chunkwise

File.open("sample.txt", "a") do |out|
for ch in "A".."Z"
File.read(ch + ".html") do |in|
while buffer = in.read(1024)
out.write buffer
end
end
end
end


Kind regards

robert
 
S

Singeo

Martin/Robert, thank you both for your quick replies. Both your
suggestions work, thanks for the valuable advice.

I'm still puzzled as to why my code (however bad....) was working with
all but the smaller files (5 of the 26 all less than 20k)). But I can
now move forward.

Regards

Singeo



2008/5/27 Singeo <[email protected]>:


Hi, I wonder if someone can take a quick look at this code and tell me
where I'm going wrong. The small files (less than 20k?) that I read in
this array are not appearing in the output file. I understand this is
a problem to do with stringio but have not found a way to fix it.
Thanks.
letters=3D("A".."Z").to_a
link_array =3D []
for index in (0...letters.length)
=A0dummy =3D letters[index] + ".html"
=A0link_array << dummy
end
open('sample.txt','w')
for index in (0...link_array.length)
=A0guide=3DFile.open(link_array[index], "r+")
=A0html =3D guide.read
=A0open('sample.txt','a') do |f|
=A0 =A0f.puts guide
=A0end
end

This has nothing to do with StringIO. =A0You do not close all your file
descriptors properly. =A0You should make it a habit to use the block
form of File.open.

Note also that you can use ("A" .. "Z") directly for iterating. =A0Also,
it does not make sense to open and close "sample.txt" all the time.
Also, why do you write the IO object to the file and not the content?
It seems your code can be achieved by doing this:

File.open("sample.txt", "a") do |out|
=A0 for ch in "A".."Z"
=A0 =A0 out.write(File.read(ch + ".html"))
=A0 end
end

If your files are larger, you should copy chunkwise

File.open("sample.txt", "a") do |out|
=A0 for ch in "A".."Z"
=A0 =A0 File.read(ch + ".html") do |in|
=A0 =A0 =A0 while buffer =3D in.read(1024)
=A0 =A0 =A0 =A0 out.write buffer
=A0 =A0 =A0 end
=A0 =A0 end
=A0 end
end

Kind regards

robert
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,995
Messages
2,570,230
Members
46,817
Latest member
DicWeils

Latest Threads

Top