Difference between revisions of "Esercizio 1, prova pratica 20/02/2014"

From Sistemi Operativi
Jump to navigation Jump to search
(Created page with "==Soluzione di DBoldrin== <source lang="c"> #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char* argv[]){ FILE *fp; char* pathname = arg...")
 
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
 +
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==
 
==Soluzione di DBoldrin==
 
<source lang="c">
 
<source lang="c">
Line 39: Line 44:
 
}
 
}
 
</source>
 
</source>
 +
 +
 +
==Soluzione di F.Mastromarino e LorenzoV==
 +
<source lang="c">
 +
#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);
 +
}
 +
</source>
 +
--[[User:F.Mastromarino|F.Mastromarino]] ([[User talk:F.Mastromarino|talk]]) 11:14, 17 March 2015 (CET)

Latest revision as of 12:07, 17 March 2015

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)