Difference between revisions of "Esercizio 1, prova pratica 20/02/2014"
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)