Difference between revisions of "Prova pratica 23 01 14"
Jump to navigation
Jump to search
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= | + | if(argc==3){ |
fprintf(stderr, "numero argomenti sbagliati \n"); | fprintf(stderr, "numero argomenti sbagliati \n"); | ||
exit(1); | exit(1); | ||
Line 47: | Line 47: | ||
int contrighe=0, contchar=0, c,cha=(int)'\n'; | int contrighe=0, contchar=0, c,cha=(int)'\n'; | ||
− | while ((c=getc(fd))!=EOF) { | + | while (((c=getc(fd))!=EOF)&&(contrighe<=nriga)) { |
if (c==cha){ | if (c==cha){ | ||
Line 59: | Line 59: | ||
} | } | ||
contchar--; | contchar--; | ||
− | printf("il numero di caratteri nella | + | printf("il numero di caratteri nella riga sono:%d",contchar); |
fclose(fd); | fclose(fd); | ||
return 0; | return 0; | ||
Line 68: | Line 68: | ||
<source lang="c"> | <source lang="c"> | ||
− | /*inizio a scorrere il file | + | /*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 79: | Line 79: | ||
getline(&line,&boh,fd); | getline(&line,&boh,fd); | ||
contchar=strlen(line)-1; | contchar=strlen(line)-1; | ||
− | printf("il numero di caratteri nella | + | 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;