Difference between revisions of "Prova pratica 23 01 14"

From Sistemi Operativi
Jump to navigation Jump to search
Line 50: Line 50:
 
 
 
                 if (c==cha){
 
                 if (c==cha){
    contrighe++;
+
                    contrighe++;
 
}
 
}
 
 
 
if ((contrighe==nriga)&&(cha!=c)){
 
if ((contrighe==nriga)&&(cha!=c)){
    printf("entro?");
 
 
    contchar++;
 
    contchar++;
 
}
 
}
Line 60: Line 59:
 
}
 
}
 
contchar--;
 
contchar--;
printf("il numero di caratteri nella righa sono:%d",contchar);
+
        printf("il numero di caratteri nella righa sono:%d",contchar);
 
         fclose(fd);
 
         fclose(fd);
 
  return 0;
 
  return 0;

Revision as of 13:00, 10 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) { 
		
                if (c==cha){
                    contrighe++;
		}
	
		if ((contrighe==nriga)&&(cha!=c)){
		    contchar++;
		}
		
	}
	contchar--;
        printf("il numero di caratteri nella righa sono:%d",contchar);
        fclose(fd);
 	return 0;
}

Secondo modo.

/*inizio a scorrere il file finche 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 righa sono: %d\n",contchar);
        fclose(fd);
 	return 0;