Difference between revisions of "Prova pratica 23 01 14"

From Sistemi Operativi
Jump to navigation Jump to search
(Created page with "== Soluzione di ababa == Scrivere un programma in C “linean” che prenda come parametro il pathname di un file e un numero intero (che chiameremo n). Il programma deve stam...")
 
 
(2 intermediate revisions by the same user not shown)
Line 19: Line 19:
 
int nriga=atoi(argv[2]);
 
int nriga=atoi(argv[2]);
 
/*controllo che siano stati passati 3 parametri alla funzione (la funzione stessa, il path, e l'intero*/
 
/*controllo che siano stati passati 3 parametri alla funzione (la funzione stessa, il path, e l'intero*/
if(argc=!3){
+
if(argc==3){
 
           fprintf(stderr, "numero argomenti sbagliati \n");
 
           fprintf(stderr, "numero argomenti sbagliati \n");
 
         exit(1);
 
         exit(1);
Line 41: Line 41:
 
    exit(3);
 
    exit(3);
 
}
 
}
 
/*inizio a scorrere il file finche non mi posiziono sulla riga giusta*/
 
int contrighe=0;
 
int contchar=0;
 
int c;
 
int cha=(int)'\n';
 
 
</source>
 
</source>
 
Primo modo
 
Primo modo
 
<source lang="c">
 
<source lang="c">
 
+
/*inizio a scorrere il file finche non mi posiziono sulla riga giusta*/
while ((c=getc(fd))!=EOF) {  
+
int contrighe=0, contchar=0, c,cha=(int)'\n';
 +
 +
        while (((c=getc(fd))!=EOF)&&(contrighe<=nriga)) {  
 
 
 
                 if (c==cha){
 
                 if (c==cha){
    contrighe++;
+
                    contrighe++;
 
}
 
}
 
 
 
if ((contrighe==nriga)&&(cha!=c)){
 
if ((contrighe==nriga)&&(cha!=c)){
    printf("entro?");
 
 
    contchar++;
 
    contchar++;
 
}
 
}
Line 64: Line 59:
 
}
 
}
 
contchar--;
 
contchar--;
printf("il numero di caratteri nella righa sono:%d",contchar);
+
        printf("il numero di caratteri nella riga sono:%d",contchar);
 
         fclose(fd);
 
         fclose(fd);
 
  return 0;
 
  return 0;
Line 73: Line 68:
  
 
<source lang="c">
 
<source lang="c">
/*inizio a scorrere il file finche non mi posiziono sulla riga giusta*/
+
/*inizio a scorrere il file finché non mi posiziono sulla riga giusta*/
 
char *line=NULL;
 
char *line=NULL;
 
int i, contchar;
 
int i, contchar;
Line 84: Line 79:
 
getline(&line,&boh,fd);
 
getline(&line,&boh,fd);
 
contchar=strlen(line)-1;
 
contchar=strlen(line)-1;
printf("il numero di caratteri nella righa sono: %d\n",contchar);
+
printf("il numero di caratteri nella riga sono: %d\n",contchar);
 
         fclose(fd);
 
         fclose(fd);
 
  return 0;
 
  return 0;
 
</source>
 
</source>

Latest revision as of 13:21, 14 April 2015

Soluzione di ababa

Scrivere un programma in C “linean” 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 riga 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.

Parte comune.

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <error.h>
#include <fcntl.h>
#include <string.h>

int main(int argc, char *argv[]){
	int nriga=atoi(argv[2]);
	/*controllo che siano stati passati 3 parametri alla funzione (la funzione stessa, il path, e l'intero*/
	if(argc==3){
           fprintf(stderr, "numero argomenti sbagliati \n");
         exit(1);
        }

        /*controllo di aver aperto il file (e di conseguenza che il secondo parametro sia il path di un file)*/	
        char *path;
	path=argv[1];
	FILE *fd;
	fd=fopen(path,"r");
	if (fd==NULL){
	   fprintf(stderr, "file non aperto correttamente\n");
	   exit(2);
	}
	
	/*controllo che il file sia regolare*/
	struct stat buf;
	lstat(path,&buf);
	if (!(S_ISREG(buf.st_mode))){
	    fprintf(stderr, "file non regolare\n");
	    exit(3);
	}

Primo modo

 /*inizio a scorrere il file finche non mi posiziono sulla riga giusta*/
	int contrighe=0, contchar=0, c,cha=(int)'\n';
	
        while (((c=getc(fd))!=EOF)&&(contrighe<=nriga)) { 
		
                if (c==cha){
                    contrighe++;
		}
	
		if ((contrighe==nriga)&&(cha!=c)){
		    contchar++;
		}
		
	}
	contchar--;
        printf("il numero di caratteri nella riga sono:%d",contchar);
        fclose(fd);
 	return 0;
}

Secondo modo.

/*inizio a scorrere il file finché non mi posiziono sulla riga giusta*/
	char *line=NULL;
	int i, contchar;
	size_t boh=0;
	for (i=0;i<nriga;i++){
		getline(&line,&boh,fd);
		free(line);
		line=NULL;
	}
	getline(&line,&boh,fd);
	contchar=strlen(line)-1;
	printf("il numero di caratteri nella riga sono: %d\n",contchar);
        fclose(fd);
 	return 0;