Prova pratica 23 01 14
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);
}
/*inizio a scorrere il file finche non mi posiziono sulla riga giusta*/
int contrighe=0;
int contchar=0;
int c;
int cha=(int)'\n';
Primo modo
while ((c=getc(fd))!=EOF) {
if (c==cha){
contrighe++;
}
if ((contrighe==nriga)&&(cha!=c)){
printf("entro?");
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;