Prova pratica 23 01 14

From Sistemi Operativi
Jump to navigation Jump to search

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;