Solved

DOS redirect stdout and back again

Posted on 1997-06-06
6
534 Views
Last Modified: 2008-03-03
I want to spawn a program (XCOPY) having directed stdout to a file for log purposes. I can do the re-direction but I lose stdout once I close the file handle. How can I recover the original stdout?

---- code sample ----
PUBLIC CdaRETVAL      ClCopyFileStructure(PCdaCHAR inDir, PCdaCHAR outDir)
{
      CdaRETVAL      retval;                                          // Return value from function
      FILE            *newStdout;                                    // Handle for re-directed stdout
      
      newStdout = freopen("c:\\temp.tmp", "w", stdout);
      if (newStdout == NULL)
      {
            printf("Cannot redirect stdout\n");
            return(cdaInternalError);
      }
      retval = _spawnlp(_P_WAIT, "xcopy", "xcopy", inDir, outDir, "/E", "/I", "/H", "/Y", NULL);
      if (retval)
      {
            printf("xcopy error %i\n", retval);
            retval = cdaInternalError;
      }
      else
            retval = cdaSuccess;

      fclose(newStdout);
      return(retval);
}

--- end of code sample ---

This code works but the stdout is lost when the function returns.
0
Comment
Question by:icd
  • 3
  • 2
6 Comments
 
LVL 3

Expert Comment

by:LucHoltkamp
ID: 1251005
You could simply use the function
system(char* cmdLine)
which executes the string in cmdLine.

char buffer[256];
sprintf(buffer, "xcopy /e/i/h/y %s %s > c:\\temp.tmp", inDir, outDir);
system(buffer);

Good Luck
.luc.
0
 
LVL 5

Author Comment

by:icd
ID: 1251006
That would be acceptable if I only had a little more output to generate but I have lots, including spawning further programs so I really want to get stdout back again.

0
 
LVL 2

Accepted Solution

by:
mlev earned 50 total points
ID: 1251007
Do not close the file handle.

freopen() does not create a new FILE structure, it just "alters" the existing one. The only useful thing you can do with the return value of freopen(), is check whether the function succeeded (otherwise it's NULL). If it did, newStdout will be equal to stdout, so your program actually performs fclose(stdout).
0
Are your AD admin tools letting you down?

Managing Active Directory can get complicated.  Often, the native tools for managing AD are just not up to the task.  The largest Active Directory installations in the world have relied on one tool to manage their day-to-day administration tasks: Hyena. Start your trial today.

 
LVL 5

Author Comment

by:icd
ID: 1251008
OK, it only 'alters' the existing file structure. So if I don't close the newStdout how do I pursuade stdout to go back to the console. Do I do a freopen("con:" or somesuch?
0
 
LVL 2

Expert Comment

by:mlev
ID: 1251009
I guess that's the simplest way, if you do not care about your program being run with redirected output, or even compiled on something other than DOS.

I think the portable way to do it should be something like:

old_stdout_fd = dup(1);
freopen("c:\\temp.tmp", "w", stdout);
...
...
fflush(stdout);
dup2(old_stdout_fd, 1);
close(old_stdout_fd);
0
 
LVL 5

Author Comment

by:icd
ID: 1251010
Sorry for the delay I got pushed off one project onto another before I could evaluate your answer.

I just got in before the 15 day deadline so you get full 200 points rather than 150 :-)

0

Featured Post

NAS Cloud Backup Strategies

This article explains backup scenarios when using network storage. We review the so-called “3-2-1 strategy” and summarize the methods you can use to send NAS data to the cloud

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Summary: This tutorial covers some basics of pointer, pointer arithmetic and function pointer. What is a pointer: A pointer is a variable which holds an address. This address might be address of another variable/address of devices/address of fu…
Windows programmers of the C/C++ variety, how many of you realise that since Window 9x Microsoft has been lying to you about what constitutes Unicode (http://en.wikipedia.org/wiki/Unicode)? They will have you believe that Unicode requires you to use…
The goal of this video is to provide viewers with basic examples to understand and use conditional statements in the C programming language.
The goal of this video is to provide viewers with basic examples to understand and use switch statements in the C programming language.

821 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question