Esercizio 1, prova pratica 20/02/2014

From Sistemi Operativi
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)