ProvaPratica 2009.09.23
Jump to navigation
Jump to search
http://www.cs.unibo.it/~renzo/so/pratiche/2009.09.23.pdf
Esercizio 1
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#define BUFSIZE 4096
void buf_invert(char *b_input, char *b_output)
{
int i;
for(i=0; i<BUFSIZE; i++)
{
if(b_input[i] == EOF)
break;
b_output[i] = b_input[BUFSIZE-i];
}
}
off_t file_dim(char *path)
{
struct stat buf;
int ris;
ris = stat (path, &buf);
if(ris == -1)
{
printf("Stat, error %d: %s\n", errno, strerror(errno));
return -1;
}
return buf.st_size;
}
int invert(int input, int output, off_t file_size)
{
char b_input[BUFSIZE], b_output[BUFSIZE];
int rris, wris;
off_t i=0;
while(i < file_size)
{
rris = pread(input, b_input, BUFSIZE, i);
if(rris == -1)
{
printf("Pread error %d: %s\n", errno, strerror(errno));
return -1;
}
i += rris;
wris = pwrite(output, b_output, BUFSIZE, file_size-i);
if(wris == -1)
{
printf("Pwrite error %d: %s\n", errno, strerror(errno));
return -1;
}
if(rris != wris)
{
printf("Invert error\n");
return -1;
}
}
return 0;
}
int main(int argc, char *argv[])
{
int input, output, ris;
off_t file_size;
if(argc > 3)
{
printf("Too many arguments\n");
return -1;
}
input = open(argv[1], O_RDONLY);
if(input == -1)
{
printf("Open error %d: %s\n", errno, strerror(errno));
return -1;
}
file_size = file_dim(argv[1]);
if(file_size == -1)
{
printf("File_dim error\n");
return -1;
}
printf("File size %d\n", file_size);
output = open(argv[2], O_CREAT | O_RDWR /*| O_APPEND*/);
if(output == -1)
{
printf("File creation (open) error %d: %s\n", errno, strerror(errno));
return -1;
}
ris = invert(input, output, file_size);
if(ris == -1)
{
printf("Invert error\n");
return -1;
}
return 0;
}
Mirko_M