COHERENT manpages
This page displays the COHERENT manpage for tmpfile() [Create a temporary file].
List of available manpages
Index
tmpfile() -- STDIO Function (libc)
Create a temporary file
#include <stdio.h>
FILE *tmpfile(void);
The function tmpfile() creates a file to hold data temporarily. The file
is opened into binary update mode (wb+) and is removed automatically when
it is closed or when the program exits. There is no way to access the
temporary file by name. If your program needs to do so, it should open a
file explicitly.
tmpfile() returns NULL if it could not create a temporary file. If it
could, it returns a pointer to the FILE associated with the temporary file.
The function exit() removes all files created by tmpfile().
Example
This example implements a primitive file editor that can edit large files.
It uses two temporary files to keep all changes. The editor accepts the
following commands:
dn delete; d52 deletes line 52
in insert; i7 inserts line before line 7
pn print; p17 prints line 17
p print the entire file
w write the edited file and quit
q quit without writing the file
The entire temporary file is copied with each command.
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdarg.h>
FILE *fp, *tmp[2];
int linecount;
fatal(message)
char *message;
{
fprintf(stderr, "%s\n", message);
exit(EXIT_FAILURE);
}
/*
* Copy up to line number or EOF.
* Return number of lines copied.
*/
static int
copy(line, *ifp, ofp)
int line; FILE *ifp, *ofp;
{
int i, c, count;
count = 0;
for(c=i=1; (i<line || line==-1) && c!=EOF; i++) {
while((c = fgetc(ifp)) != EOF && c != '\n')
fputc(c, ofp);
if(c == '\n') {
count++;
fputc('\n', ofp);
}
}
return(count);
}
/*
* Read a file until line number is read.
* Return 1 if line is found before EOF.
*/
static int
find(line, ifp)
int line; FILE *ifp;
{
int i, c;
for(c=i=1; i<line && c!=EOF; i++)
while((c = fgetc(ifp)) != EOF && c != '\n')
;
return(c != EOF);
}
main(int argc, char *argv[])
{
int i, line, args;
char c, cmdbuf[80];
if(argc != 2)
fatal("usage: tmpfile filename\n");
if((tmp[0]=tmpfile())==NULL||(tmp[1]=tmpfile())==NULL)
fatal("Error opening tmpfile\n");
if((fp = fopen(argv[1], "r")) == NULL)
fatal("Error opening input file\n");
linecount = copy(-1, fp, tmp[i = 0]);
fclose(fp);
/* one file pass per command */
for(;;) {
if(gets(cmdbuf) == NULL)
fatal("EOF on stdin\n");
if(!(args = sscanf(cmdbuf, "%c%d", &c, &line)))
continue;
fseek(tmp[i], 0L, SEEK_SET);
switch(c) {
/* Write edited file */
case 'w':
if((fp = fopen(argv[1], "w")) == NULL)
fatal("Error opening file\n");
copy(linecount + 1, tmp[i], fp);
fclose(fp);
/* Quit */
case 'q':
exit(EXIT_SUCCESS);
/* Print entire file */
case 'p':
if(args == 1) {
copy(linecount + 1, tmp[i], stdout);
continue;
}
if(find(line, tmp[i]))
copy(2, tmp[i], stdout);
continue;
/* Delete a line */
case 'd':
if(args == 1)
printf("dn where n is a number\n");
else if(line > linecount)
printf("only %d lines\n", linecount);
else {
copy(line, tmp[i], tmp[i^1]);
if(find(2, tmp[i]))
copy(-1, tmp[i], tmp[i^1]);
linecount--;
fseek(tmp[i], 0L, SEEK_SET);
i ^= 1;
}
continue;
/* Insert a line */
case 'i':
if(1 == args)
printf("in where n is a number\n");
else if(line > linecount)
printf("only %d lines\n", linecount);
else {
copy(line, tmp[i], tmp[i^1]);
printf("Enter inserted line\n");
copy(2, stdin, tmp[i^1]);
copy(-1, tmp[i], tmp[i^1]);
linecount++;
fseek(tmp[i], 0L, SEEK_SET);
i ^= 1;
}
continue;
default:
printf("Invalid request\n");
continue;
}
}
}
See Also
mktemp(),
libc,
tempnam(),
tmpnam()
ANSI Standard, §7.9.4.3
POSIX Standard, §8.1
Notes
If a program exits abnormally or aborts, the files created by tmpfile() may
not be removed.