473,326 Members | 2,061 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,326 software developers and data experts.

freopen


Hi All,

I have a question regarding the standard C library.

Is it possible to have one process (program) that
redirects its stdin to a file, and have a second program
use that file write/append to that file. The first program
will then read its redirected standard input file and
process that...

The first program is like this:

#include <stdio.h>
#include <string.h>

void main (void)
{
FILE *f_stdin = NULL;
char buf [501];

f_stdin = freopen ("stdin", "a+", stdin);
if (f_stdin != NULL)
{
buf[0] = '\0';
while (1)
{
fgets (buf, 500, f_stdin);
if (strlen (buf) 0)
printf ("buf: %s\n", buf);
if (strcmp (buf, "q") == 0)
break;
buf[0] = '\0';
}
}
else
{
perror ("error(first prog)");
}
}

The second program is:

#include <stdio.h>

void main (void)
{
FILE *f_stdin = NULL;

f_stdin = fopen ("stdin", "a+");
if (f_stdin != NULL)
{
fputs ("a test", f_stdin);
}
else
{
perror ("error(second prog)");
}
}

The code below (creating two executables) compiles.
I can redirect stdin in the first program and can open
and write in the second program. Altough the string is
written to the file, I can not read that from the first
program.

Can you see anything wrong in the above code? Is the
freopen usage correct? Can freopen be used to
redirect std streams to files and have other processes
write to these files and command the first proces?

Regards,
ht

Aug 18 '07 #1
4 4130
Hl******@gmail.com writes:
Hi All,

I have a question regarding the standard C library.

Is it possible to have one process (program) that
redirects its stdin to a file, and have a second program
use that file write/append to that file. The first program
will then read its redirected standard input file and
process that...
With a following wind and lot fiddling you can get this sort of thing
to work on some platforms. However, what you are doing -- a pair of
programs connected by a buffer -- is so common that there are loads of
way to do it properly. The best way to do it will depend on how
portable you want your solution to be.

Ultimately you will have to go and ask in a group that deals with the
kind of systems that you want this to work on. Standard C (the topic
here) can do little more than read and write streams.

<code snipped>
Can you see anything wrong in the above code? Is the
freopen usage correct? Can freopen be used to
redirect std streams to files and have other processes
write to these files and command the first proces?
The freopen is a red herring. The program could just as well use
fopen. On some system, you don't need a file at all -- the output of
one can be "plugged" into the input of the other.

--
Ben.
Aug 18 '07 #2
Hl******@gmail.com wrote:

# Is it possible to have one process (program) that
# redirects its stdin to a file, and have a second program
# use that file write/append to that file. The first program
# will then read its redirected standard input file and
# process that...

As a counterexample, it will probably not work the way you expect
on Unix. If you open read a plain disk file, the kernel does not
change the behavior if there are writers - either you get data
that is currently in the file, or you get an EOF. You don't get
paused while other writers catch up. (There are other types of
files that this will work on in Unix, but these types of files
are not available on all other systems.)

Perhaps your stdio will let read past an EOF so you can keep
trying to see if the file has been extended. (The underlying
Unix I/O permits this, allowing commands like tail -f.) But I
think this is system dependent behaviour.

On Unix freopn to stderr is irrelevant to this: it's a property
of the files themselves not the FILE* connected to them.

--
SM Ryan http://www.rawbw.com/~wyrmwif/
Raining down sulphur is like an endurance trial, man. Genocide is the
most exhausting activity one can engage in. Next to soccer.
Aug 19 '07 #3
Hl******@gmail.com wrote:
Hi All,

I have a question regarding the standard C library.

Is it possible to have one process (program) that
redirects its stdin to a file, and have a second program
use that file write/append to that file. The first program
will then read its redirected standard input file and
process that...
Success in this manner is very dependent on which
OS you are using. You should direct this question
to the proper developer newsgroup for that OS.

Under the various *nix OS's, you may have a 'mkfifo'
or similar command (try 'man mkfifo'). This is almost
exactly what you want.

However, under *nix, you usually get this behavior
simply by doing 'prog1 | prog2' at the command line.
No programming required. The MS-DOS command shell
does a half-hearted emulation of this.

Under other OS's, you may or may not have similar
functionality, just under a different name.

....
The code below (creating two executables) compiles.
I can redirect stdin in the first program and can open
and write in the second program. Altough the string is
written to the file, I can not read that from the first
program.

Can you see anything wrong in the above code? Is the
freopen usage correct? Can freopen be used to
redirect std streams to files and have other processes
write to these files and command the first proces?

Regards,
ht
----== Posted via Newsfeeds.Com - Unlimited-Unrestricted-Secure Usenet News==----
http://www.newsfeeds.com The #1 Newsgroup Service in the World! 120,000+ Newsgroups
----= East and West-Coast Server Farms - Total Privacy via Encryption =----
Aug 20 '07 #4
On 18 A ustos, 21:05, Hlk.T...@gmail.com wrote:
Hi All,

I have a question regarding the standard C library.

Is it possible to have one process (program) that
redirects its stdin to a file, and have a second program
use that file write/append to that file. The first program
will then read its redirected standard input file and
process that...

The first program is like this:

#include <stdio.h>
#include <string.h>

void main (void)
{
FILE *f_stdin = NULL;
char buf [501];

f_stdin =freopen("stdin", "a+", stdin);
if (f_stdin != NULL)
{
buf[0] = '\0';
while (1)
{
fgets (buf, 500, f_stdin);
if (strlen (buf) 0)
printf ("buf: %s\n", buf);
if (strcmp (buf, "q") == 0)
break;
buf[0] = '\0';
}
}
else
{
perror ("error(first prog)");
}

}

The second program is:

#include <stdio.h>

void main (void)
{
FILE *f_stdin = NULL;

f_stdin = fopen ("stdin", "a+");
if (f_stdin != NULL)
{
fputs ("a test", f_stdin);
}
else
{
perror ("error(second prog)");
}

}

The code below (creating two executables) compiles.
I can redirect stdin in the first program and can open
and write in the second program. Altough the string is
written to the file, I can not read that from the first
program.

Can you see anything wrong in the above code? Is thefreopenusage correct? Canfreopenbe used to
redirect std streams to files and have other processes
write to these files and command the first proces?

Regards,
ht
Thank you all for the responses.

ht

Aug 21 '07 #5

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

1
by: Alex Vinokur | last post by:
Hi, Where has output-to-cout gone in the program below? Thanks, ========= C++ code : File foo.cpp : BEGIN ========= #include <cstdio> #include <cassert> #include <iostream>
4
by: Rouben Rostamian | last post by:
Consider the following demo program: #include <stdio.h> int main(void) { unsigned char c; for (c=0; c<15; c++) putchar(c);
2
by: Alex Vinokur | last post by:
Hi, freopen closes stdout, but it seems that fclose doesn't restore it (see sample below). How can one print to stdout after using freopen? ========= C code : File foo.c : BEGIN...
8
by: John Forkosh | last post by:
I have a C program that writes binary output to stdout, which works fine in Unix/Linux. But when someone else compiled and ran it in Windows, every time the program emitted a 0x0A, Windows...
3
by: John Devereux | last post by:
Hi, I am a bit confused about the behaviour of freopen() and the standard i/o streams. I am trying to redirect a stream (stderr) to a particular "file". But, if the call fails I want it to...
1
by: joshuawilsonster | last post by:
I have checked: http://c-faq.com/stdio/undofreopen.html and don't believe it addresses my question. I am dealing with large files of numbers and want to take in small chunks and act on...
1
by: system55 | last post by:
is it possible to reopen a file (using freopen) eventhough that file is already opened by an fopen function???
2
by: Guillaume Dargaud | last post by:
Hello all, a while ago I was pointed towards freopen as a way to redirect stderr to a log file. It works great, but apparently the app also writes a few lines to stdout. Now I could redirect to 2...
5
by: Joakim Hove | last post by:
Hello, I have written a program in C; this programs uses an external proprietary library. When calling a certain function in the external library, the particular function writes a message to...
0
by: ryjfgjl | last post by:
ExcelToDatabase: batch import excel into database automatically...
0
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
1
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
0
by: jfyes | last post by:
As a hardware engineer, after seeing that CEIWEI recently released a new tool for Modbus RTU Over TCP/UDP filtering and monitoring, I actively went to its official website to take a look. It turned...
1
by: PapaRatzi | last post by:
Hello, I am teaching myself MS Access forms design and Visual Basic. I've created a table to capture a list of Top 30 singles and forms to capture new entries. The final step is a form (unbound)...
1
by: CloudSolutions | last post by:
Introduction: For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
1
by: Defcon1945 | last post by:
I'm trying to learn Python using Pycharm but import shutil doesn't work
1
by: Shællîpôpï 09 | last post by:
If u are using a keypad phone, how do u turn on JavaScript, to access features like WhatsApp, Facebook, Instagram....
0
by: Faith0G | last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.