Esercizio 1, prova pratica, 23-01-2014
Jump to navigation
Jump to search
Testo
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.
Soluzione di Stefano Zaniboni
#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <error.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
int isRegular(const char *path){ /*controllo se il file e' regolare*/
struct stat path_stat;
lstat(path, &path_stat);
return S_ISREG(path_stat.st_mode);
}
int main(int argc, char *argv[]){
FILE *fp;
int status=0;
char *line=NULL;
size_t len=0;
int line_to_count=0;
ssize_t read;
int i=1;
if(argc != 3){
fprintf(stderr, "no such arguments \n");
exit(1);
}
line_to_count=atoi(argv[2]);
if(!(status=isRegular(argv[1]))){
printf("error not regular file\n");
exit(EXIT_FAILURE);
}
fp=fopen(argv[1], "r");
if(fp==NULL){
exit(EXIT_FAILURE);
}
while((read=getline(&line,&len,fp)) != -1){
if(i==line_to_count){
printf("retrived line of lenght %zu: \n",i, read);
printf("%s\n", line);
break;
}
i=i+1;
}
free(line);
exit(EXIT_SUCCESS);
}
Codice scritto e caricato al confine di Stato Italia - Austria