Problem reading small files - stringio problem?

Discussion in 'Ruby' started by Singeo, May 27, 2008.

  1. Singeo

    Singeo Guest

    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
    Singeo, May 27, 2008
    #1
    1. Advertising

  2. Singeo

    Martin Boese Guest

    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


    On Tuesday 27 May 2008 12:37:37 Singeo wrote:
    > 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
    Martin Boese, May 27, 2008
    #2
    1. Advertising

  3. 2008/5/27 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


    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

    --
    use.inject do |as, often| as.you_can - without end
    Robert Klemme, May 27, 2008
    #3
  4. Singeo

    Singeo Guest

    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



    On May 27, 8:52=A0pm, "Robert Klemme" <>
    wrote:
    > 2008/5/27 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=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
    >
    > --
    > use.inject do |as, often| as.you_can - without end
    Singeo, May 27, 2008
    #4
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Skip Montanaro
    Replies:
    0
    Views:
    141
    Skip Montanaro
    May 30, 2013
  2. Cameron Simpson
    Replies:
    0
    Views:
    84
    Cameron Simpson
    May 31, 2013
  3. Göktuğ Kayaalp
    Replies:
    0
    Views:
    105
    Göktuğ Kayaalp
    May 31, 2013
  4. Skip Montanaro
    Replies:
    0
    Views:
    100
    Skip Montanaro
    May 31, 2013
  5. Serhiy Storchaka
    Replies:
    0
    Views:
    69
    Serhiy Storchaka
    May 31, 2013
Loading...

Share This Page