Esercizio 1, prova pratica, 23-01-2014

From Sistemi Operativi
Revision as of 05:39, 12 April 2015 by Stefano.zaniboni (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
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