masala_curry has asked for the wisdom of the Perl Monks concerning the following question:

Hello,

I have a C program say cProg.c that asks the user to enter a filename, (opens that file and operates over it) and saves the output in a file "output.txt"


I have a PERL script main.pl
I wish to somehow generate the output.txt when I run main.pl

I am using vi editor to do all this and my university already has all the required compilers, interpreters etc...

For easier understanding, lets say this is how the C file looks like:
==============cProg.c=====================
#include< stdio.h> main (int argc, char *argv[]) { FILE *fp; if (argc!= 2) printf ("Please Enter a FileName\n"); else { fp = fopen (argv[1], "r"); printf ("File Found\n"); fclose (fp); } return 0; }

=================cProg.c Ends=================
I compile and run this program this way:
[ ~ ] gcc cProg.c
[ ~ ] ./a.out input.txt > output.txt

This generates output.txt which has "File Found" as its only contents.

Now I wish to write a PERL script which would automatically generate "output.txt" when i execute the PERL script
=================main.pl====================
#!/usr/bin/perl ./a.out input.txt > output.txt ###How should I do this? $output_file="output.txt"; open(OP, $output_file) || die("Could not open file!"); @sequence=<OP>; # tosses the contents of "output.txt" in an array +"@sequence" to work on.
===============mail.pl ENDS====================

Kindly show me the path to heaven =)

Replies are listed 'Best First'.
Re: How to run C object code in PERL
by tilly (Archbishop) on Apr 04, 2009 at 04:18 UTC
    If you want to handle this in Perl the best solution is to not use a temp file at all:
    #! /usr/bin/perl use strict; use warnings; my $cmd = "./a.out input.txt"; open(my $pipe, "-|", $cmd) or die "Can't run '$cmd': $!"; my @sequence = <$pipe>; # Proceed to process output.
      Works like a Charm!
Re: How to run C object code in PERL
by gwadej (Chaplain) on Apr 04, 2009 at 04:15 UTC

    There are many ways to solve this. I would probably use system in this case.

    G. Wade
Re: How to run C object code in PERL
by Bloodnok (Vicar) on Apr 04, 2009 at 12:55 UTC
    It's not too clear what ###How should I do this? means, but my reading of it suggests that you might be trying to compile & run the C code (c/w writing a perl script to emulate your C code) something along the following lines ...
    use warnings; use strict; system 'gcc cProg.c'; die "Compile failed - $!" if $? >> 8; system './a.out input.txt > output.txt'; die "Run failed" if $? >> 8;
    I used system, since there is no (apparent) requirement to capture output - only to run the command and continue dependant on the success status.

    Your comment tosses the contents of "output.txt" in an array "@sequence" to work on is only true in the context of a file containing a single line - as in your example.

    If it were a multi-line file, you might want to undef the input record separator ($/ - see perlvar) in order to slurp the file into the array in one operation.

    A user level that continues to overstate my experience :-))
      Thanks a lot tilly and Bloodnok. Both solutions are quite elegant.

      In my problem, I find it convenient to have an output.txt file for later viewing. Also, I need the user to mention the names of input and output files.

      So I would use Bloodnok's solution for my problem.