From: Thomas Ackermann <Thomas.Ackermann@eWave.at>
To: linux-c-programming@vger.kernel.org
Subject: having probs with files > 2G
Date: Fri, 24 May 2002 16:41:23 +0200 [thread overview]
Message-ID: <3CEE5113.1000702@eWave.at> (raw)
[-- Attachment #1: Type: text/plain, Size: 364 bytes --]
hi!
i hope i'm not off topic with this, but, i'having problems with some
split-like program i'm writing at the moment.
when opening files > 2GB the program freezes when data is read from the
file the first time.
had it already working before with a buffer size of (char)1 before but
that went really slow..
source code is attached, please help..
thx, thomas
[-- Attachment #2: asplit.c --]
[-- Type: text/plain, Size: 2041 bytes --]
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
void usage (char *pn)
{
printf("\
%s - split INPUT file into a piece of\n\
SIZE1 bytes and remaining pieces of SIZE2\n\n\
Usage: %s [SIZE1 SIZE2 INPUT]\n"
,pn,pn);
exit(0);
}
int main (int argc, char *argv[] )
{
char *progname;
int fdin, fdout;
char *buf;
char *file;
char *fileout;
int ac, bc;
int fc = 0;
int bsize, bread;
int btotal = 0;
struct stat stat_buf;
struct stat64 *stat_buf64;
progname = argv[0];
if (argc < 4)
usage(progname);
file = argv[3];
ac = atoi(argv[1]);
bc = atoi(argv[2]);
fileout = malloc (sizeof(char) * (strlen(file) + 24));
sprintf(fileout, "%s.slice-%d", file, fc);
// open input file
fdin = open64(file, O_RDONLY);
if (fdin == -1)
{
printf("error: %s\n", strerror(errno));
exit(0);
}
// adjust read buffer to an optimal size
if (fstat(fdin, &stat_buf) < 0)
{
if (errno == 75)
{
if (fstat64(fdin, stat_buf64) < 0)
{
printf("error 0: %s\n", strerror(errno));
exit(0);
} else
bsize = (int) stat_buf64->st_blksize;
}
else
{
printf("error 1: %s\n", strerror(errno));
exit(0);
}
} else
bsize = (int) stat_buf.st_blksize;
buf = (char *) malloc (bsize + 1);
// read first bytes
bread = read(fdin, buf, bsize);
printf("read:%d\n", bread);
if (bread == -1)
{
printf("error 2: %s\n", strerror(errno));
close(fdin);
exit(0);
}
// if successfilly read, open output file
fdout = open64(fileout, O_WRONLY|O_CREAT|O_TRUNC, 0666);
// while data can be read from file
while (bread > 0)
{
btotal += bread;
write(fdout, buf, bread);
// cut off first slice
if ((fc > 0 && btotal >= bc) || (fc == 0 && btotal >= ac ))
{
fc++;
sprintf(fileout, "%s.slice-%d", file, fc);
close(fdout);
fdout = open64(fileout, O_CREAT|O_WRONLY|O_TRUNC, 0666);
btotal = 0;
}
bread = read(fdin, buf, bsize);
}
close(fdout);
close(fdin);
}
next reply other threads:[~2002-05-24 14:41 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-05-24 14:41 Thomas Ackermann [this message]
2002-05-24 15:14 ` having probs with files > 2G William N. Zanatta
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3CEE5113.1000702@eWave.at \
--to=thomas.ackermann@ewave.at \
--cc=linux-c-programming@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.