Esercizio 1, prova pratica 20/02/2014
Jump to navigation
Jump to search
Scrivere un programma in C “colonnan” che prenda come parametro il pathname di un file e un numero intero (che chiameremo n). Il programma deve stampare come output il numero di caratteri presenti nella n-ma colonna del file se il file e' un file regolare di testo, non deve stampare nulla negli altri casi. Un file viene considerato di testo se tutti i suoi byte hanno valori compresi nel range 1-127. Per controllare se il file e' “regolare” usare la system call lstat.
Soluzione di DBoldrin
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[]){
FILE *fp;
char* pathname = argv[1];
int contachar=0;
int contacolonna=0;
char carattere[2];
int n=atoi(argv[argc-1]);
int c;
fp = fopen(pathname,"r"); // read mode
if( fp == NULL )
{
perror("Error while opening the file.\n");
exit(EXIT_FAILURE);
}
printf("il numero di elementi nella colonna %d del file %s sono:\n",n,pathname);
while ((c= getc(fp)) != EOF) {
if ((carattere[1] = c) == '\n')
contacolonna=0;
else
contacolonna++;
if(contacolonna==n){
contachar++;
}
}
printf("%d\n",contachar);
fclose(fp);
return 0;
}
Soluzione di F.Mastromarino e LorenzoV
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
int main(int argc, char *argv[]){
int cont=0; int c; int colonna=atoi(argv[1]); int cont2=0;
char *path="/home/francesco/Scrivania/stampa.txt";
int fd=open(path, O_RDONLY, 0664); //0664 sono i permessi per la sola lettura
fd=dup2(fd, STDIN_FILENO); //file stampa.txt come standard input
struct stat buf;
if(lstat(path, &buf)<0 && (buf.st_mode & S_IFMT)!=S_IFREG) // il campo st_mode indica il tipo di file e la costante S_IFREG
//contiene il valore di un file regolare(0100000), S_IFMT è la maschera di bit usata per controllare il tipo di file
return(-1);
do{
cont=0;
do{
c=getchar(); // legge un carattere da file e lo ritorna come un intero
if(c!= EOF && (c>127 || c<1)){ // controllo se è un file ASCII
printf("Non regolare\n");
return(-1);
}
cont++;
if(cont==colonna) cont2++;
}while(c!='\n' && c!=EOF);
}while(c!=EOF); // EOF è l'ultimo carattere del file da leggere
printf("%d\n", cont2);
close(fd);
return(0);
}
--F.Mastromarino (talk) 11:14, 17 March 2015 (CET)